Skip to content
Open

Momose #1408

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
93b4076
update
momoren1919-ship-it Jan 22, 2026
a854827
Add Dify workflow chat mode and system prompt integration
momoren1919-ship-it Jan 24, 2026
2382ea8
Update prompts.ts
KatoShion Jan 26, 2026
46eed35
Update prompts.ts
KatoShion Jan 26, 2026
d7e83f0
Update prompts.ts
KatoShion Jan 26, 2026
13eb8e6
Create hello.md
momoren1919-ship-it Jan 26, 2026
a14a318
Merge pull request #1 from momoren1919-ship-it/momose
momoren1919-ship-it Jan 26, 2026
5189948
Save Dify workflow DSL to database
momoren1919-ship-it Jan 30, 2026
ef41e42
Add direct AI provider mode and provider selection
momoren1919-ship-it Feb 3, 2026
630d0e3
Add AI_DIFY_MODEL to pin /dify DSL model
momoren1919-ship-it Feb 4, 2026
8e55278
Replace direct mode instructions with AI SDK note
momoren1919-ship-it Feb 4, 2026
0d43bde
fix: update workflow DSL and config
KatoShion Feb 4, 2026
ad6daf2
Save DSL, improve validation, and UI/input fixes
momoren1919-ship-it Feb 5, 2026
8efae7f
Create k
momoren1919-ship-it Feb 5, 2026
b0931db
Delete k
momoren1919-ship-it Feb 5, 2026
b2b5939
Add Dify CLI Bash tool, README, and .gitignore
momoren1919-ship-it Feb 5, 2026
f49f9a8
Add Dify Console client and auto-import support
momoren1919-ship-it Feb 5, 2026
32d4b92
Add Dify DSL auto-import & UI handling
momoren1919-ship-it Feb 5, 2026
fa68cb1
Remove polite-conversion DSL & workflows
momoren1919-ship-it Feb 5, 2026
1d89c3d
Auto-import DIFY DSL on stream finish
momoren1919-ship-it Feb 5, 2026
b07d9ce
Clarify password/base64 behavior and add DSL
momoren1919-ship-it Feb 5, 2026
1a84aa1
ログイン実装
KatoShion Feb 5, 2026
fc8afc5
Remove showModelSelector prop; delete DSL app YAMLs
momoren1919-ship-it Feb 5, 2026
2c5bc80
ガイドラインの追加とdatabase処理の修正
KatoShion Feb 11, 2026
fdeccc1
Add architecture doc and two DSL workflows
momoren1919-ship-it Feb 13, 2026
22abe0f
Merge remote-tracking branch 'origin/sync-local' into momose
momoren1919-ship-it Feb 13, 2026
838ce31
able to select LLM model
KatoShion Feb 17, 2026
0c87477
modify prompt.ts
KatoShion Feb 17, 2026
2b37e7a
Merge branch 'sync-local' into momose
KatoShion Feb 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
19 changes: 19 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,31 @@ AUTH_SECRET=****
# The following keys below are automatically created and
# added to your environment when you deploy on Vercel

# AI provider mode:
# - "gateway" (default): use Vercel AI Gateway (billed via Vercel credits)
# - "direct": use your own provider API keys (e.g. OpenAI/Anthropic/Google)
AI_PROVIDER_MODE=gateway

# Instructions to create an AI Gateway API key here: https://vercel.com/ai-gateway
# API key required for non-Vercel deployments
# For Vercel deployments, OIDC tokens are used automatically
# https://vercel.com/ai-gateway
AI_GATEWAY_API_KEY=****

# Direct provider keys (required when AI_PROVIDER_MODE=direct)
OPENAI_API_KEY=****
ANTHROPIC_API_KEY=****
GOOGLE_GENERATIVE_AI_API_KEY=****

# Optional (AI_PROVIDER_MODE=direct): default models for non-chat tasks.
# Use the same "provider/model" IDs as in lib/ai/models.ts
AI_DEFAULT_MODEL=openai/gpt-4.1-mini
AI_TITLE_MODEL=openai/gpt-4.1-mini
AI_ARTIFACT_MODEL=openai/gpt-4.1-mini

# Optional: fixed model for Dify DSL generation (/dify)
AI_DIFY_MODEL=openai/gpt-4.1-mini


# Instructions to create a Vercel Blob Store here: https://vercel.com/docs/vercel-blob
BLOB_READ_WRITE_TOKEN=****
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,7 @@ yarn-error.log*
/playwright-report/
/blob-report/
/playwright/*

# Dify CLI authentication files
.dify_auth
.dify_csrf
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* @license React
* use-sync-external-store-shim.native.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

"use strict";
var React = require("react");
function is(x, y) {
return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);
}
var objectIs = "function" === typeof Object.is ? Object.is : is,
useState = React.useState,
useEffect = React.useEffect,
useLayoutEffect = React.useLayoutEffect,
useDebugValue = React.useDebugValue;
function useSyncExternalStore$1(subscribe, getSnapshot) {
var value = getSnapshot(),
_useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),
inst = _useState[0].inst,
forceUpdate = _useState[1];
useLayoutEffect(
function () {
inst.value = value;
inst.getSnapshot = getSnapshot;
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
},
[subscribe, value, getSnapshot]
);
useEffect(
function () {
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
return subscribe(function () {
checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });
});
},
[subscribe]
);
useDebugValue(value);
return value;
}
function checkIfSnapshotChanged(inst) {
var latestGetSnapshot = inst.getSnapshot;
inst = inst.value;
try {
var nextValue = latestGetSnapshot();
return !objectIs(inst, nextValue);
} catch (error) {
return !0;
}
}
exports.useSyncExternalStore =
void 0 !== React.useSyncExternalStore
? React.useSyncExternalStore
: useSyncExternalStore$1;
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// packages/react/use-size/src/use-size.tsx
import * as React from "react";
import { useLayoutEffect } from "@radix-ui/react-use-layout-effect";
function useSize(element) {
const [size, setSize] = React.useState(void 0);
useLayoutEffect(() => {
if (element) {
setSize({ width: element.offsetWidth, height: element.offsetHeight });
const resizeObserver = new ResizeObserver((entries) => {
if (!Array.isArray(entries)) {
return;
}
if (!entries.length) {
return;
}
const entry = entries[0];
let width;
let height;
if ("borderBoxSize" in entry) {
const borderSizeEntry = entry["borderBoxSize"];
const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;
width = borderSize["inlineSize"];
height = borderSize["blockSize"];
} else {
width = element.offsetWidth;
height = element.offsetHeight;
}
setSize({ width, height });
});
resizeObserver.observe(element, { box: "border-box" });
return () => resizeObserver.unobserve(element);
} else {
setSize(void 0);
}
}, [element]);
return size;
}
export {
useSize
};
//# sourceMappingURL=index.mjs.map
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.applyRepeatEachIndex = applyRepeatEachIndex;
exports.bindFileSuiteToProject = bindFileSuiteToProject;
exports.filterByFocusedLine = filterByFocusedLine;
exports.filterByTestIds = filterByTestIds;
exports.filterOnly = filterOnly;
exports.filterSuite = filterSuite;
exports.filterSuiteWithOnlySemantics = filterSuiteWithOnlySemantics;
exports.filterTestsRemoveEmptySuites = filterTestsRemoveEmptySuites;
var _path = _interopRequireDefault(require("path"));
var _utils = require("playwright-core/lib/utils");
var _util = require("../util");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* Copyright Microsoft Corporation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

function filterSuite(suite, suiteFilter, testFilter) {
for (const child of suite.suites) {
if (!suiteFilter(child)) filterSuite(child, suiteFilter, testFilter);
}
const filteredTests = suite.tests.filter(testFilter);
const entries = new Set([...suite.suites, ...filteredTests]);
suite._entries = suite._entries.filter(e => entries.has(e)); // Preserve the order.
}
function filterTestsRemoveEmptySuites(suite, filter) {
const filteredSuites = suite.suites.filter(child => filterTestsRemoveEmptySuites(child, filter));
const filteredTests = suite.tests.filter(filter);
const entries = new Set([...filteredSuites, ...filteredTests]);
suite._entries = suite._entries.filter(e => entries.has(e)); // Preserve the order.
return !!suite._entries.length;
}
function bindFileSuiteToProject(project, suite) {
const relativeFile = _path.default.relative(project.project.testDir, suite.location.file);
const fileId = (0, _utils.calculateSha1)((0, _utils.toPosixPath)(relativeFile)).slice(0, 20);

// Clone suite.
const result = suite._deepClone();
result._fileId = fileId;

// Assign test properties with project-specific values.
result.forEachTest((test, suite) => {
suite._fileId = fileId;
// At the point of the query, suite is not yet attached to the project, so we only get file, describe and test titles.
const [file, ...titles] = test.titlePath();
const testIdExpression = `[project=${project.id}]${(0, _utils.toPosixPath)(file)}\x1e${titles.join('\x1e')}`;
const testId = fileId + '-' + (0, _utils.calculateSha1)(testIdExpression).slice(0, 20);
test.id = testId;
test._projectId = project.id;

// Inherit properties from parent suites.
let inheritedRetries;
let inheritedTimeout;
test.annotations = [];
for (let parentSuite = suite; parentSuite; parentSuite = parentSuite.parent) {
if (parentSuite._staticAnnotations.length) test.annotations = [...parentSuite._staticAnnotations, ...test.annotations];
if (inheritedRetries === undefined && parentSuite._retries !== undefined) inheritedRetries = parentSuite._retries;
if (inheritedTimeout === undefined && parentSuite._timeout !== undefined) inheritedTimeout = parentSuite._timeout;
}
test.retries = inheritedRetries !== null && inheritedRetries !== void 0 ? inheritedRetries : project.project.retries;
test.timeout = inheritedTimeout !== null && inheritedTimeout !== void 0 ? inheritedTimeout : project.project.timeout;
test.annotations.push(...test._staticAnnotations);

// Skip annotations imply skipped expectedStatus.
if (test.annotations.some(a => a.type === 'skip' || a.type === 'fixme')) test.expectedStatus = 'skipped';

// We only compute / set digest in the runner.
if (test._poolDigest) test._workerHash = `${project.id}-${test._poolDigest}-0`;
});
return result;
}
function applyRepeatEachIndex(project, fileSuite, repeatEachIndex) {
// Assign test properties with project-specific values.
fileSuite.forEachTest((test, suite) => {
if (repeatEachIndex) {
const [file, ...titles] = test.titlePath();
const testIdExpression = `[project=${project.id}]${(0, _utils.toPosixPath)(file)}\x1e${titles.join('\x1e')} (repeat:${repeatEachIndex})`;
const testId = suite._fileId + '-' + (0, _utils.calculateSha1)(testIdExpression).slice(0, 20);
test.id = testId;
test.repeatEachIndex = repeatEachIndex;
if (test._poolDigest) test._workerHash = `${project.id}-${test._poolDigest}-${repeatEachIndex}`;
}
});
}
function filterOnly(suite) {
if (!suite._getOnlyItems().length) return;
const suiteFilter = suite => suite._only;
const testFilter = test => test._only;
return filterSuiteWithOnlySemantics(suite, suiteFilter, testFilter);
}
function filterSuiteWithOnlySemantics(suite, suiteFilter, testFilter) {
const onlySuites = suite.suites.filter(child => filterSuiteWithOnlySemantics(child, suiteFilter, testFilter) || suiteFilter(child));
const onlyTests = suite.tests.filter(testFilter);
const onlyEntries = new Set([...onlySuites, ...onlyTests]);
if (onlyEntries.size) {
suite._entries = suite._entries.filter(e => onlyEntries.has(e)); // Preserve the order.
return true;
}
return false;
}
function filterByFocusedLine(suite, focusedTestFileLines) {
if (!focusedTestFileLines.length) return;
const matchers = focusedTestFileLines.map(createFileMatcherFromFilter);
const testFileLineMatches = (testFileName, testLine, testColumn) => matchers.some(m => m(testFileName, testLine, testColumn));
const suiteFilter = suite => !!suite.location && testFileLineMatches(suite.location.file, suite.location.line, suite.location.column);
const testFilter = test => testFileLineMatches(test.location.file, test.location.line, test.location.column);
return filterSuite(suite, suiteFilter, testFilter);
}
function filterByTestIds(suite, testIdMatcher) {
if (!testIdMatcher) return;
filterTestsRemoveEmptySuites(suite, test => testIdMatcher(test.id));
}
function createFileMatcherFromFilter(filter) {
const fileMatcher = (0, _util.createFileMatcher)(filter.re || filter.exact || '');
return (testFileName, testLine, testColumn) => fileMatcher(testFileName) && (filter.line === testLine || filter.line === null) && (filter.column === testColumn || filter.column === null);
}
Loading