@jinion/core 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent.d.ts +6 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +16 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/claude/backend.d.ts +8 -0
- package/dist/agent/claude/backend.d.ts.map +1 -1
- package/dist/agent/claude/backend.js +19 -5
- package/dist/agent/claude/backend.js.map +1 -1
- package/dist/agent/claude/commands.d.ts +2 -0
- package/dist/agent/claude/commands.d.ts.map +1 -1
- package/dist/agent/claude/events.js +1 -1
- package/dist/agent/claude/events.js.map +1 -1
- package/dist/agent/claude/guard.d.ts.map +1 -1
- package/dist/agent/claude/guard.js +2 -1
- package/dist/agent/claude/guard.js.map +1 -1
- package/dist/agent/claude/jinion-tools.d.ts +9 -1
- package/dist/agent/claude/jinion-tools.d.ts.map +1 -1
- package/dist/agent/claude/jinion-tools.js +14 -2
- package/dist/agent/claude/jinion-tools.js.map +1 -1
- package/dist/agent/claude/mcp.d.ts +2 -1
- package/dist/agent/claude/mcp.d.ts.map +1 -1
- package/dist/agent/claude/mcp.js +38 -1
- package/dist/agent/claude/mcp.js.map +1 -1
- package/dist/agent/claude/options.d.ts +9 -1
- package/dist/agent/claude/options.d.ts.map +1 -1
- package/dist/agent/claude/options.js +5 -3
- package/dist/agent/claude/options.js.map +1 -1
- package/dist/agent/claude/paths.d.ts +0 -3
- package/dist/agent/claude/paths.d.ts.map +1 -1
- package/dist/agent/claude/paths.js +1 -7
- package/dist/agent/claude/paths.js.map +1 -1
- package/dist/agent/claude/permissions.js +1 -1
- package/dist/agent/claude/permissions.js.map +1 -1
- package/dist/agent/claude/plugins.d.ts +6 -0
- package/dist/agent/claude/plugins.d.ts.map +1 -1
- package/dist/agent/claude/plugins.js +11 -5
- package/dist/agent/claude/plugins.js.map +1 -1
- package/dist/agent/claude/prompt.d.ts +2 -1
- package/dist/agent/claude/prompt.d.ts.map +1 -1
- package/dist/agent/claude/prompt.js +10 -5
- package/dist/agent/claude/prompt.js.map +1 -1
- package/dist/agent/claude/review.d.ts +4 -1
- package/dist/agent/claude/review.d.ts.map +1 -1
- package/dist/agent/claude/review.js +5 -2
- package/dist/agent/claude/review.js.map +1 -1
- package/dist/agent/claude/session.d.ts +7 -0
- package/dist/agent/claude/session.d.ts.map +1 -1
- package/dist/agent/claude/session.js +6 -1
- package/dist/agent/claude/session.js.map +1 -1
- package/dist/agent/claude/setup-info.d.ts +21 -0
- package/dist/agent/claude/setup-info.d.ts.map +1 -0
- package/dist/agent/claude/setup-info.js +18 -0
- package/dist/agent/claude/setup-info.js.map +1 -0
- package/dist/agent/claude/setup.d.ts +12 -0
- package/dist/agent/claude/setup.d.ts.map +1 -0
- package/dist/agent/claude/setup.js +37 -0
- package/dist/agent/claude/setup.js.map +1 -0
- package/dist/agent/claude/shell.d.ts +0 -1
- package/dist/agent/claude/shell.d.ts.map +1 -1
- package/dist/agent/claude/shell.js +1 -59
- package/dist/agent/claude/shell.js.map +1 -1
- package/dist/agent/claude/skills.d.ts +8 -0
- package/dist/agent/claude/skills.d.ts.map +1 -0
- package/dist/agent/claude/skills.js +32 -0
- package/dist/agent/claude/skills.js.map +1 -0
- package/dist/agent/claude/tool-calls.d.ts.map +1 -1
- package/dist/agent/claude/tool-calls.js +11 -2
- package/dist/agent/claude/tool-calls.js.map +1 -1
- package/dist/agent/codex/backend.d.ts +7 -1
- package/dist/agent/codex/backend.d.ts.map +1 -1
- package/dist/agent/codex/backend.js +16 -3
- package/dist/agent/codex/backend.js.map +1 -1
- package/dist/agent/codex/events.d.ts.map +1 -1
- package/dist/agent/codex/events.js +15 -1
- package/dist/agent/codex/events.js.map +1 -1
- package/dist/agent/codex/jinion-tools.d.ts +38 -4
- package/dist/agent/codex/jinion-tools.d.ts.map +1 -1
- package/dist/agent/codex/jinion-tools.js +57 -10
- package/dist/agent/codex/jinion-tools.js.map +1 -1
- package/dist/agent/codex/mcp.d.ts.map +1 -1
- package/dist/agent/codex/mcp.js +4 -0
- package/dist/agent/codex/mcp.js.map +1 -1
- package/dist/agent/codex/rewind.js +1 -47
- package/dist/agent/codex/rewind.js.map +1 -1
- package/dist/agent/codex/session.d.ts +9 -2
- package/dist/agent/codex/session.d.ts.map +1 -1
- package/dist/agent/codex/session.js +21 -7
- package/dist/agent/codex/session.js.map +1 -1
- package/dist/agent/demo/agent.d.ts +6 -0
- package/dist/agent/demo/agent.d.ts.map +1 -1
- package/dist/agent/demo/agent.js +7 -1
- package/dist/agent/demo/agent.js.map +1 -1
- package/dist/agent/demo/mcp.d.ts +17 -0
- package/dist/agent/demo/mcp.d.ts.map +1 -0
- package/dist/agent/demo/mcp.js +155 -0
- package/dist/agent/demo/mcp.js.map +1 -0
- package/dist/agent/demo/scenarios/pricing-card.d.ts +3 -0
- package/dist/agent/demo/scenarios/pricing-card.d.ts.map +1 -0
- package/dist/agent/demo/scenarios/pricing-card.js +43 -0
- package/dist/agent/demo/scenarios/pricing-card.js.map +1 -0
- package/dist/agent/demo/script.d.ts +10 -0
- package/dist/agent/demo/script.d.ts.map +1 -1
- package/dist/agent/demo/skills.d.ts +29 -0
- package/dist/agent/demo/skills.d.ts.map +1 -0
- package/dist/agent/demo/skills.js +85 -0
- package/dist/agent/demo/skills.js.map +1 -0
- package/dist/agent/demo/tasks.d.ts +5 -0
- package/dist/agent/demo/tasks.d.ts.map +1 -1
- package/dist/agent/events.d.ts +5 -0
- package/dist/agent/events.d.ts.map +1 -1
- package/dist/agent/events.js +2 -0
- package/dist/agent/events.js.map +1 -1
- package/dist/agent/mcp.d.ts +11 -0
- package/dist/agent/mcp.d.ts.map +1 -1
- package/dist/agent/mcp.js +4 -0
- package/dist/agent/mcp.js.map +1 -1
- package/dist/agent/patches.d.ts +5 -0
- package/dist/agent/patches.d.ts.map +1 -1
- package/dist/agent/patches.js +49 -0
- package/dist/agent/patches.js.map +1 -1
- package/dist/agent/review-tools.d.ts +15 -0
- package/dist/agent/review-tools.d.ts.map +1 -0
- package/dist/agent/review-tools.js +13 -0
- package/dist/agent/review-tools.js.map +1 -0
- package/dist/agent/review.d.ts +18 -6
- package/dist/agent/review.d.ts.map +1 -1
- package/dist/agent/review.js +52 -17
- package/dist/agent/review.js.map +1 -1
- package/dist/agent/skills.d.ts +36 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +18 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/api/client.d.ts +25 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +14 -3
- package/dist/api/client.js.map +1 -1
- package/dist/api/connection.d.ts +5 -0
- package/dist/api/connection.d.ts.map +1 -1
- package/dist/api/connection.js +10 -0
- package/dist/api/connection.js.map +1 -1
- package/dist/api/fields.d.ts +12 -1
- package/dist/api/fields.d.ts.map +1 -1
- package/dist/api/fields.js +4 -2
- package/dist/api/fields.js.map +1 -1
- package/dist/api/json-schema.d.ts +729 -86
- package/dist/api/json-schema.d.ts.map +1 -1
- package/dist/api/json-schema.js +2 -1
- package/dist/api/json-schema.js.map +1 -1
- package/dist/api/methods/accounts.d.ts.map +1 -1
- package/dist/api/methods/accounts.js +1 -2
- package/dist/api/methods/accounts.js.map +1 -1
- package/dist/api/methods/app.d.ts.map +1 -1
- package/dist/api/methods/app.js +19 -5
- package/dist/api/methods/app.js.map +1 -1
- package/dist/api/methods/files.d.ts +3 -1
- package/dist/api/methods/files.d.ts.map +1 -1
- package/dist/api/methods/files.js +75 -2
- package/dist/api/methods/files.js.map +1 -1
- package/dist/api/methods/git.d.ts.map +1 -1
- package/dist/api/methods/git.js +54 -6
- package/dist/api/methods/git.js.map +1 -1
- package/dist/api/methods/lsp.d.ts +7 -0
- package/dist/api/methods/lsp.d.ts.map +1 -0
- package/dist/api/methods/lsp.js +68 -0
- package/dist/api/methods/lsp.js.map +1 -0
- package/dist/api/methods/map.d.ts +4 -0
- package/dist/api/methods/map.d.ts.map +1 -0
- package/dist/api/methods/map.js +13 -0
- package/dist/api/methods/map.js.map +1 -0
- package/dist/api/methods/preview.d.ts +4 -1
- package/dist/api/methods/preview.d.ts.map +1 -1
- package/dist/api/methods/preview.js +19 -3
- package/dist/api/methods/preview.js.map +1 -1
- package/dist/api/methods/skills.d.ts +4 -0
- package/dist/api/methods/skills.d.ts.map +1 -0
- package/dist/api/methods/skills.js +21 -0
- package/dist/api/methods/skills.js.map +1 -0
- package/dist/api/methods/terminals.d.ts.map +1 -1
- package/dist/api/methods/terminals.js +7 -1
- package/dist/api/methods/terminals.js.map +1 -1
- package/dist/api/protocol.d.ts +963 -7
- package/dist/api/protocol.d.ts.map +1 -1
- package/dist/api/protocol.js +155 -8
- package/dist/api/protocol.js.map +1 -1
- package/dist/api/schemas.d.ts +27 -0
- package/dist/api/schemas.d.ts.map +1 -1
- package/dist/api/schemas.js +6 -0
- package/dist/api/schemas.js.map +1 -1
- package/dist/api/screen.d.ts +2 -0
- package/dist/api/screen.d.ts.map +1 -1
- package/dist/api/screen.js +3 -0
- package/dist/api/screen.js.map +1 -1
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +13 -0
- package/dist/api/server.js.map +1 -1
- package/dist/commands/builtin.d.ts.map +1 -1
- package/dist/commands/builtin.js +5 -1
- package/dist/commands/builtin.js.map +1 -1
- package/dist/commands/conversation.d.ts.map +1 -1
- package/dist/commands/conversation.js +2 -0
- package/dist/commands/conversation.js.map +1 -1
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +1 -0
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/notifications.d.ts.map +1 -1
- package/dist/commands/notifications.js +5 -3
- package/dist/commands/notifications.js.map +1 -1
- package/dist/commands/registry.d.ts +3 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +14 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/skill.d.ts +5 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +30 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/views.d.ts +2 -0
- package/dist/commands/views.d.ts.map +1 -1
- package/dist/commands/views.js +15 -1
- package/dist/commands/views.js.map +1 -1
- package/dist/controllers/accounts.d.ts +5 -2
- package/dist/controllers/accounts.d.ts.map +1 -1
- package/dist/controllers/accounts.js +11 -8
- package/dist/controllers/accounts.js.map +1 -1
- package/dist/controllers/context.d.ts +6 -0
- package/dist/controllers/context.d.ts.map +1 -1
- package/dist/controllers/context.js +3 -0
- package/dist/controllers/context.js.map +1 -1
- package/dist/controllers/feedback.d.ts +1 -1
- package/dist/controllers/feedback.d.ts.map +1 -1
- package/dist/controllers/feedback.js +4 -1
- package/dist/controllers/feedback.js.map +1 -1
- package/dist/controllers/input.d.ts.map +1 -1
- package/dist/controllers/input.js +2 -0
- package/dist/controllers/input.js.map +1 -1
- package/dist/controllers/jinion.d.ts +9 -1
- package/dist/controllers/jinion.d.ts.map +1 -1
- package/dist/controllers/jinion.js +9 -1
- package/dist/controllers/jinion.js.map +1 -1
- package/dist/controllers/mcp.d.ts +11 -2
- package/dist/controllers/mcp.d.ts.map +1 -1
- package/dist/controllers/mcp.js +42 -7
- package/dist/controllers/mcp.js.map +1 -1
- package/dist/controllers/session.d.ts.map +1 -1
- package/dist/controllers/session.js +4 -0
- package/dist/controllers/session.js.map +1 -1
- package/dist/conversation/activity.d.ts +5 -0
- package/dist/conversation/activity.d.ts.map +1 -0
- package/dist/conversation/activity.js +41 -0
- package/dist/conversation/activity.js.map +1 -0
- package/dist/conversation/apply-event.d.ts.map +1 -1
- package/dist/conversation/apply-event.js +2 -1
- package/dist/conversation/apply-event.js.map +1 -1
- package/dist/conversation/edits.d.ts +5 -0
- package/dist/conversation/edits.d.ts.map +1 -1
- package/dist/conversation/edits.js +10 -0
- package/dist/conversation/edits.js.map +1 -1
- package/dist/conversation/reducer.d.ts +15 -0
- package/dist/conversation/reducer.d.ts.map +1 -1
- package/dist/design/guides.d.ts +78 -5
- package/dist/design/guides.d.ts.map +1 -1
- package/dist/design/guides.js +78 -5
- package/dist/design/guides.js.map +1 -1
- package/dist/design/prompt.d.ts +1 -1
- package/dist/design/prompt.d.ts.map +1 -1
- package/dist/design/prompt.js +2 -2
- package/dist/design/prompt.js.map +1 -1
- package/dist/design/tools.d.ts +2 -0
- package/dist/design/tools.d.ts.map +1 -1
- package/dist/design/tools.js +6 -2
- package/dist/design/tools.js.map +1 -1
- package/dist/directions/directions.d.ts +42 -0
- package/dist/directions/directions.d.ts.map +1 -0
- package/dist/directions/directions.js +120 -0
- package/dist/directions/directions.js.map +1 -0
- package/dist/directions/store.d.ts +34 -0
- package/dist/directions/store.d.ts.map +1 -0
- package/dist/directions/store.js +61 -0
- package/dist/directions/store.js.map +1 -0
- package/dist/directions/tools.d.ts +29 -0
- package/dist/directions/tools.d.ts.map +1 -0
- package/dist/directions/tools.js +57 -0
- package/dist/directions/tools.js.map +1 -0
- package/dist/directions/viewer.d.ts +6 -0
- package/dist/directions/viewer.d.ts.map +1 -0
- package/dist/directions/viewer.js +266 -0
- package/dist/directions/viewer.js.map +1 -0
- package/dist/files/names.d.ts +6 -0
- package/dist/files/names.d.ts.map +1 -0
- package/dist/files/names.js +18 -0
- package/dist/files/names.js.map +1 -0
- package/dist/files/operations.d.ts +54 -0
- package/dist/files/operations.d.ts.map +1 -0
- package/dist/files/operations.js +173 -0
- package/dist/files/operations.js.map +1 -0
- package/dist/files/search.d.ts +11 -0
- package/dist/files/search.d.ts.map +1 -0
- package/dist/files/search.js +112 -0
- package/dist/files/search.js.map +1 -0
- package/dist/files/trash.d.ts +11 -0
- package/dist/files/trash.d.ts.map +1 -0
- package/dist/files/trash.js +64 -0
- package/dist/files/trash.js.map +1 -0
- package/dist/files/types.d.ts +112 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/types.js +47 -0
- package/dist/files/types.js.map +1 -0
- package/dist/files/watch.d.ts +26 -0
- package/dist/files/watch.d.ts.map +1 -0
- package/dist/files/watch.js +107 -0
- package/dist/files/watch.js.map +1 -0
- package/dist/git/blame.d.ts +10 -0
- package/dist/git/blame.d.ts.map +1 -0
- package/dist/git/blame.js +91 -0
- package/dist/git/blame.js.map +1 -0
- package/dist/git/repos.d.ts +5 -0
- package/dist/git/repos.d.ts.map +1 -1
- package/dist/git/repos.js +13 -0
- package/dist/git/repos.js.map +1 -1
- package/dist/git/staging.d.ts +10 -1
- package/dist/git/staging.d.ts.map +1 -1
- package/dist/git/staging.js +21 -0
- package/dist/git/staging.js.map +1 -1
- package/dist/git/types.d.ts +48 -0
- package/dist/git/types.d.ts.map +1 -1
- package/dist/git/types.js +25 -0
- package/dist/git/types.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +8 -1
- package/dist/host.js.map +1 -1
- package/dist/lib/changelog.d.ts +12 -0
- package/dist/lib/changelog.d.ts.map +1 -0
- package/dist/lib/changelog.js +52 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/glob.d.ts +6 -0
- package/dist/lib/glob.d.ts.map +1 -0
- package/dist/lib/glob.js +49 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/paths.d.ts +3 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +9 -1
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/shell-words.d.ts +2 -0
- package/dist/lib/shell-words.d.ts.map +1 -0
- package/dist/lib/shell-words.js +60 -0
- package/dist/lib/shell-words.js.map +1 -0
- package/dist/look/tools.d.ts +7 -1
- package/dist/look/tools.d.ts.map +1 -1
- package/dist/look/tools.js +19 -4
- package/dist/look/tools.js.map +1 -1
- package/dist/lsp/code-intelligence.d.ts +87 -0
- package/dist/lsp/code-intelligence.d.ts.map +1 -0
- package/dist/lsp/code-intelligence.js +343 -0
- package/dist/lsp/code-intelligence.js.map +1 -0
- package/dist/lsp/edits.d.ts +4 -0
- package/dist/lsp/edits.d.ts.map +1 -0
- package/dist/lsp/edits.js +14 -0
- package/dist/lsp/edits.js.map +1 -0
- package/dist/lsp/project-check.d.ts +8 -0
- package/dist/lsp/project-check.d.ts.map +1 -0
- package/dist/lsp/project-check.js +71 -0
- package/dist/lsp/project-check.js.map +1 -0
- package/dist/lsp/results.d.ts +95 -0
- package/dist/lsp/results.d.ts.map +1 -0
- package/dist/lsp/results.js +116 -0
- package/dist/lsp/results.js.map +1 -0
- package/dist/lsp/server.d.ts +22 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +123 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/servers.d.ts +21 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +57 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/transport.d.ts +9 -0
- package/dist/lsp/transport.d.ts.map +1 -0
- package/dist/lsp/transport.js +64 -0
- package/dist/lsp/transport.js.map +1 -0
- package/dist/lsp/types.d.ts +262 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +64 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/map/conventions.d.ts +18 -2
- package/dist/map/conventions.d.ts.map +1 -1
- package/dist/map/conventions.js +17 -7
- package/dist/map/conventions.js.map +1 -1
- package/dist/map/look.d.ts +23 -0
- package/dist/map/look.d.ts.map +1 -1
- package/dist/map/look.js +26 -16
- package/dist/map/look.js.map +1 -1
- package/dist/map/overview.d.ts +54 -0
- package/dist/map/overview.d.ts.map +1 -0
- package/dist/map/overview.js +32 -0
- package/dist/map/overview.js.map +1 -0
- package/dist/map/project-overview.d.ts +5 -0
- package/dist/map/project-overview.d.ts.map +1 -0
- package/dist/map/project-overview.js +35 -0
- package/dist/map/project-overview.js.map +1 -0
- package/dist/map/prompt.d.ts.map +1 -1
- package/dist/map/prompt.js +17 -38
- package/dist/map/prompt.js.map +1 -1
- package/dist/map/review.d.ts +29 -9
- package/dist/map/review.d.ts.map +1 -1
- package/dist/map/review.js +105 -25
- package/dist/map/review.js.map +1 -1
- package/dist/map/rules-request.d.ts +4 -0
- package/dist/map/rules-request.d.ts.map +1 -0
- package/dist/map/rules-request.js +6 -0
- package/dist/map/rules-request.js.map +1 -0
- package/dist/mcp/config.d.ts +3 -10
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +5 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/login.d.ts +2 -0
- package/dist/mcp/login.d.ts.map +1 -1
- package/dist/mcp/login.js +5 -0
- package/dist/mcp/login.js.map +1 -1
- package/dist/mcp/transport.d.ts +16 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +11 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/memory/import.d.ts +10 -1
- package/dist/memory/import.d.ts.map +1 -1
- package/dist/memory/import.js +14 -6
- package/dist/memory/import.js.map +1 -1
- package/dist/preview/pages.d.ts +17 -0
- package/dist/preview/pages.d.ts.map +1 -0
- package/dist/preview/pages.js +92 -0
- package/dist/preview/pages.js.map +1 -0
- package/dist/preview/previews.d.ts +22 -0
- package/dist/preview/previews.d.ts.map +1 -0
- package/dist/preview/previews.js +28 -0
- package/dist/preview/previews.js.map +1 -0
- package/dist/preview/prompt.d.ts +3 -0
- package/dist/preview/prompt.d.ts.map +1 -0
- package/dist/preview/prompt.js +5 -0
- package/dist/preview/prompt.js.map +1 -0
- package/dist/preview/tools.d.ts +21 -0
- package/dist/preview/tools.d.ts.map +1 -0
- package/dist/preview/tools.js +34 -0
- package/dist/preview/tools.js.map +1 -0
- package/dist/preview/types.d.ts +7 -0
- package/dist/preview/types.d.ts.map +1 -1
- package/dist/preview/types.js +2 -0
- package/dist/preview/types.js.map +1 -1
- package/dist/prompt/files.d.ts +4 -1
- package/dist/prompt/files.d.ts.map +1 -1
- package/dist/prompt/files.js +23 -8
- package/dist/prompt/files.js.map +1 -1
- package/dist/prompt/skills.d.ts +2 -0
- package/dist/prompt/skills.d.ts.map +1 -1
- package/dist/settings/project.d.ts +2 -0
- package/dist/settings/project.d.ts.map +1 -1
- package/dist/settings/project.js.map +1 -1
- package/dist/settings/user.d.ts +2 -0
- package/dist/settings/user.d.ts.map +1 -1
- package/dist/settings/user.js.map +1 -1
- package/dist/skills/folders.d.ts +30 -0
- package/dist/skills/folders.d.ts.map +1 -0
- package/dist/skills/folders.js +70 -0
- package/dist/skills/folders.js.map +1 -0
- package/dist/skills/skill-file.d.ts +10 -0
- package/dist/skills/skill-file.d.ts.map +1 -0
- package/dist/skills/skill-file.js +68 -0
- package/dist/skills/skill-file.js.map +1 -0
- package/dist/skills/tools.d.ts +26 -0
- package/dist/skills/tools.d.ts.map +1 -0
- package/dist/skills/tools.js +34 -0
- package/dist/skills/tools.js.map +1 -0
- package/dist/state/agent.d.ts +8 -0
- package/dist/state/agent.d.ts.map +1 -1
- package/dist/state/preferences.d.ts +2 -0
- package/dist/state/preferences.d.ts.map +1 -1
- package/dist/state/preferences.js +3 -1
- package/dist/state/preferences.js.map +1 -1
- package/dist/state/session.d.ts +6 -0
- package/dist/state/session.d.ts.map +1 -1
- package/dist/state/session.js +1 -0
- package/dist/state/session.js.map +1 -1
- package/package.json +3 -1
- package/schema/api.json +3872 -146
- package/vendor/darwin-arm64/build.json +62 -0
- package/vendor/darwin-arm64/ffmpeg +0 -0
- package/vendor/darwin-arm64/ffprobe +0 -0
- package/vendor/darwin-arm64/licenses/README.md +13 -0
- package/vendor/darwin-arm64/licenses/ffmpeg-LGPL-2.1.txt +502 -0
- package/vendor/darwin-arm64/licenses/whisper.cpp-MIT.txt +21 -0
- package/vendor/darwin-arm64/voices.bin +0 -0
- package/vendor/darwin-arm64/whisper-cli +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { projectDir } from '../lib/paths.js';
|
|
5
|
+
/** The project's rounds of directions, a folder each, out of the project and of git. */
|
|
6
|
+
export class DirectionsStore {
|
|
7
|
+
cwd;
|
|
8
|
+
constructor(cwd) {
|
|
9
|
+
this.cwd = cwd;
|
|
10
|
+
}
|
|
11
|
+
get dir() {
|
|
12
|
+
return join(projectDir(this.cwd), 'directions');
|
|
13
|
+
}
|
|
14
|
+
add({ title, directions }) {
|
|
15
|
+
const round = { id: randomUUID().slice(0, 8), title, at: Date.now(), directions: directions.map(({ name, idea }) => ({ name, idea })) };
|
|
16
|
+
const folder = join(this.dir, round.id);
|
|
17
|
+
mkdirSync(folder, { recursive: true });
|
|
18
|
+
for (const [index, { html }] of directions.entries())
|
|
19
|
+
writeFileSync(join(folder, pageName(index)), html);
|
|
20
|
+
this.save(round);
|
|
21
|
+
return round;
|
|
22
|
+
}
|
|
23
|
+
/** The newest first. */
|
|
24
|
+
list() {
|
|
25
|
+
if (!existsSync(this.dir))
|
|
26
|
+
return [];
|
|
27
|
+
return readdirSync(this.dir)
|
|
28
|
+
.flatMap((id) => this.get(id) ?? [])
|
|
29
|
+
.sort((a, b) => b.at - a.at);
|
|
30
|
+
}
|
|
31
|
+
get(id) {
|
|
32
|
+
if (!ROUND_ID.test(id))
|
|
33
|
+
return undefined;
|
|
34
|
+
const file = join(this.dir, id, 'round.json');
|
|
35
|
+
return existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : undefined;
|
|
36
|
+
}
|
|
37
|
+
/** The page of a round's direction, by its place in the round. */
|
|
38
|
+
page(id, index) {
|
|
39
|
+
const round = this.get(id);
|
|
40
|
+
if (!round || !Number.isInteger(index) || index < 0 || index >= round.directions.length)
|
|
41
|
+
return undefined;
|
|
42
|
+
return readFileSync(join(this.dir, id, pageName(index)), 'utf8');
|
|
43
|
+
}
|
|
44
|
+
pick(id, name) {
|
|
45
|
+
const round = this.get(id);
|
|
46
|
+
if (!round?.directions.some((direction) => direction.name === name))
|
|
47
|
+
return undefined;
|
|
48
|
+
const picked = { ...round, picked: name };
|
|
49
|
+
this.save(picked);
|
|
50
|
+
return picked;
|
|
51
|
+
}
|
|
52
|
+
save(round) {
|
|
53
|
+
writeFileSync(join(this.dir, round.id, 'round.json'), `${JSON.stringify(round, null, 2)}\n`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Ids come back in addresses, so only one of ours ever names a folder.
|
|
57
|
+
const ROUND_ID = /^[0-9a-f]{8}$/;
|
|
58
|
+
function pageName(index) {
|
|
59
|
+
return `${index + 1}.html`;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/directions/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolCall } from '../agent/tools.js';
|
|
3
|
+
import type { Previews } from '../preview/previews.js';
|
|
4
|
+
import { type Directions, type Picked } from './directions.js';
|
|
5
|
+
/** A tool the agent shows directions with; each backend offers it its own way. */
|
|
6
|
+
export interface DirectionsTool<S extends z.ZodRawShape = z.ZodRawShape> {
|
|
7
|
+
description: string;
|
|
8
|
+
input: S;
|
|
9
|
+
run(input: z.infer<z.ZodObject<S>>): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
/** `onPick` is told of a pick on a round this conversation showed; `previews` opens the round beside the thread where the app has a Preview. */
|
|
12
|
+
export declare function directionsTools(directions: Directions, onPick: (picked: Picked) => void, previews?: Previews): {
|
|
13
|
+
show_directions: DirectionsTool<{
|
|
14
|
+
title: z.ZodString;
|
|
15
|
+
directions: z.ZodArray<z.ZodObject<{
|
|
16
|
+
name: z.ZodString;
|
|
17
|
+
idea: z.ZodString;
|
|
18
|
+
html: z.ZodString;
|
|
19
|
+
}, z.core.$strip>>;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
export type DirectionsTools = ReturnType<typeof directionsTools>;
|
|
23
|
+
export type DirectionsAction = keyof DirectionsTools;
|
|
24
|
+
export declare const DIRECTIONS_ACTIONS: Set<string>;
|
|
25
|
+
/** A call of the tool as the conversation shows it, worded alike whichever backend made it. */
|
|
26
|
+
export declare function directionsCall(input: unknown): ToolCall;
|
|
27
|
+
/** What the user's pick says to the agent, as their own message. */
|
|
28
|
+
export declare function pickMessage({ round, direction }: Picked): string;
|
|
29
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/directions/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAkB,MAAM,iBAAiB,CAAC;AAE/E,kFAAkF;AAClF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,CAAC,CAAC;IACT,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAMD,gJAAgJ;AAChJ,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ;IAEzG,eAAe;;;;;;;;EA4ClB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAEjE,MAAM,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC;AAErD,eAAO,MAAM,kBAAkB,aAAoE,CAAC;AAEpG,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAIvD;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,UAEvD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorMessage } from '../lib/errors.js';
|
|
3
|
+
import { SIDEBAR_CLOSED } from './directions.js';
|
|
4
|
+
const MAX_PAGE_BYTES = 2 * 1024 * 1024;
|
|
5
|
+
const define = (tool) => tool;
|
|
6
|
+
/** `onPick` is told of a pick on a round this conversation showed; `previews` opens the round beside the thread where the app has a Preview. */
|
|
7
|
+
export function directionsTools(directions, onPick, previews) {
|
|
8
|
+
return {
|
|
9
|
+
show_directions: define({
|
|
10
|
+
description: "Shows the user a round of directions to pick from, in Jinion's own viewer outside the project: each direction's name, its idea in a sentence and its page. Use it whenever you offer directions, rather than describing them in words or writing their pages into the project. Nothing is written in the project and nothing is asked. The user's pick comes back as their next message.",
|
|
11
|
+
input: {
|
|
12
|
+
title: z.string().describe('What the round decides, in a few words, such as "The today screen".'),
|
|
13
|
+
directions: z
|
|
14
|
+
.array(z.object({
|
|
15
|
+
name: z.string().describe('A word or two the user can call it by.'),
|
|
16
|
+
idea: z.string().describe('What it stands for and what it gives up, in a sentence.'),
|
|
17
|
+
html: z
|
|
18
|
+
.string()
|
|
19
|
+
.describe("Its page: one whole HTML document, its CSS and any script inline, pictures as data: URLs or from the web. Nothing from the project's files or its dev server, which the viewer can't reach."),
|
|
20
|
+
}))
|
|
21
|
+
.min(2)
|
|
22
|
+
.max(4),
|
|
23
|
+
},
|
|
24
|
+
run: async ({ title, directions: offered }) => {
|
|
25
|
+
const names = offered.map(({ name }) => name.trim());
|
|
26
|
+
if (new Set(names).size < names.length)
|
|
27
|
+
return 'Two directions have the same name. Give each its own, so the user can tell them apart.';
|
|
28
|
+
const large = offered.find(({ html }) => Buffer.byteLength(html) > MAX_PAGE_BYTES);
|
|
29
|
+
if (large)
|
|
30
|
+
return `The page of ${large.name} is over 2 MB. Leave large pictures out, or take them from the web.`;
|
|
31
|
+
const { address, pages, shown } = await directions.show({ title, directions: offered.map((direction, index) => ({ ...direction, name: names[index] })) }, onPick);
|
|
32
|
+
const preview = previews?.client;
|
|
33
|
+
const opened = preview && !(await preview.open(`${address}${SIDEBAR_CLOSED}`).catch((error) => ({ error: errorMessage(error) }))).error;
|
|
34
|
+
return [
|
|
35
|
+
opened
|
|
36
|
+
? 'The directions are open in the Preview beside the conversation, where the user sees them now.'
|
|
37
|
+
: `The directions are shown. Give the user this address to open in their browser: ${address}`,
|
|
38
|
+
'They pick there, and the pick comes back as their next message; they may also answer in words. Until they pick, build none of the directions in the project.',
|
|
39
|
+
'Before you tell them, look at each page with `look`; if one needs fixing, show the round again:',
|
|
40
|
+
// In the Preview each is looked at in the viewer, so the round stays where the user sees it.
|
|
41
|
+
...(opened ? shown : pages).map((page, index) => `- ${names[index]}: ${page}`),
|
|
42
|
+
].join('\n');
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export const DIRECTIONS_ACTIONS = new Set(['show_directions']);
|
|
48
|
+
/** A call of the tool as the conversation shows it, worded alike whichever backend made it. */
|
|
49
|
+
export function directionsCall(input) {
|
|
50
|
+
const { title } = (input ?? {});
|
|
51
|
+
return { name: 'other', input: { title: 'Show directions', detail: String(title ?? '') } };
|
|
52
|
+
}
|
|
53
|
+
/** What the user's pick says to the agent, as their own message. */
|
|
54
|
+
export function pickMessage({ round, direction }) {
|
|
55
|
+
return `I pick ${direction}, of the directions for ${round.title}.`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/directions/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The viewer the core serves, as drawn in @jinion/ui's playground (`pages/directions`): one page that reads the rounds
|
|
3
|
+
* from beside it. The core draws no React, so it is written out here, with @jinion/ui's tokens by the same names.
|
|
4
|
+
*/
|
|
5
|
+
export declare function viewerPage(project: string): string;
|
|
6
|
+
//# sourceMappingURL=viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/directions/viewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,UAezC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The viewer the core serves, as drawn in @jinion/ui's playground (`pages/directions`): one page that reads the rounds
|
|
3
|
+
* from beside it. The core draws no React, so it is written out here, with @jinion/ui's tokens by the same names.
|
|
4
|
+
*/
|
|
5
|
+
export function viewerPage(project) {
|
|
6
|
+
return `<!doctype html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="utf-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
11
|
+
<title>Directions</title>
|
|
12
|
+
<style>${STYLE}</style>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<nav id="rounds"><h1><span class="strong">Directions</span><span class="faint">${escapeHtml(project)}</span></h1></nav>
|
|
16
|
+
<main><div class="sheet" id="sheet"></div></main>
|
|
17
|
+
<script>${SCRIPT}</script>
|
|
18
|
+
</body>
|
|
19
|
+
</html>`;
|
|
20
|
+
}
|
|
21
|
+
function escapeHtml(text) {
|
|
22
|
+
return text.replace(/[&<>"']/g, (character) => `&#${character.charCodeAt(0)};`);
|
|
23
|
+
}
|
|
24
|
+
const STYLE = `
|
|
25
|
+
:root {
|
|
26
|
+
--background: #ffffff;
|
|
27
|
+
--raised: #f4f5f8;
|
|
28
|
+
--floating: #ffffff;
|
|
29
|
+
--ink: #12162a;
|
|
30
|
+
--muted: #5c6275;
|
|
31
|
+
--faint: #989dae;
|
|
32
|
+
--edge: rgb(18 22 42 / 0.1);
|
|
33
|
+
--shade: rgb(18 22 42 / 0.045);
|
|
34
|
+
--selected: rgb(18 22 42 / 0.07);
|
|
35
|
+
--primary: #181e33;
|
|
36
|
+
--on-primary: #ffffff;
|
|
37
|
+
--float-shadow: 0 6px 24px -8px rgb(0 0 0 / 0.14), 0 0 0 0.5px rgb(0 0 0 / 0.1);
|
|
38
|
+
--sheet-shadow: 0 0 0 1px rgb(0 0 0 / 0.05), 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
39
|
+
--font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
|
|
40
|
+
--font-mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
|
|
41
|
+
color-scheme: light;
|
|
42
|
+
}
|
|
43
|
+
* { box-sizing: border-box; }
|
|
44
|
+
html, body { height: 100%; margin: 0; }
|
|
45
|
+
body { display: flex; background: var(--raised); color: var(--ink); font: 13px/20px var(--font-sans); -webkit-font-smoothing: antialiased; }
|
|
46
|
+
button { font: inherit; color: inherit; border: 0; background: none; padding: 0; cursor: default; text-align: left; transition: background-color 100ms ease-out, color 100ms ease-out; }
|
|
47
|
+
button:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; }
|
|
48
|
+
.strong { font-weight: 600; }
|
|
49
|
+
.faint { color: var(--faint); }
|
|
50
|
+
.small { font-size: 12px; line-height: 16px; }
|
|
51
|
+
.truncate { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
52
|
+
nav { display: flex; flex-direction: column; gap: 1px; width: 224px; flex-shrink: 0; padding: 12px; overflow-y: auto; }
|
|
53
|
+
nav h1 { display: flex; align-items: baseline; gap: 8px; margin: 0; padding: 4px 10px 12px; font-size: inherit; font-weight: 400; min-width: 0; }
|
|
54
|
+
.round { display: flex; flex-direction: column; min-width: 0; border-radius: 8px; padding: 6px 10px; color: var(--muted); }
|
|
55
|
+
.round:hover { color: var(--ink); }
|
|
56
|
+
.round[aria-current="true"] { background: var(--shade); color: var(--ink); }
|
|
57
|
+
main { flex: 1; min-width: 0; padding: 12px 12px 12px 0; }
|
|
58
|
+
.sidebar-closed nav { display: none; }
|
|
59
|
+
.sidebar-closed main { padding-left: 12px; }
|
|
60
|
+
.sheet { position: relative; height: 100%; overflow: hidden; border-radius: 12px; background: var(--background); box-shadow: var(--sheet-shadow); }
|
|
61
|
+
iframe { display: block; width: 100%; height: 100%; border: 0; }
|
|
62
|
+
.dock { position: absolute; inset: auto 16px 16px; display: flex; justify-content: center; pointer-events: none; }
|
|
63
|
+
.switcher { display: flex; align-items: center; gap: 4px; max-width: 100%; min-width: 0; padding: 4px; border-radius: 16px; background: var(--floating); box-shadow: var(--float-shadow); pointer-events: auto; user-select: none; }
|
|
64
|
+
.options { display: flex; gap: 4px; min-width: 0; overflow-x: auto; }
|
|
65
|
+
.option { display: flex; flex-direction: column; gap: 2px; width: 208px; min-width: 144px; flex-shrink: 1; border-radius: 12px; padding: 8px 12px; }
|
|
66
|
+
.option:hover { background: var(--shade); }
|
|
67
|
+
.option[aria-pressed="true"] { background: var(--selected); }
|
|
68
|
+
.option-head { display: flex; align-items: center; gap: 6px; }
|
|
69
|
+
.option-name { font-weight: 500; color: var(--ink); }
|
|
70
|
+
.option-number { margin-left: auto; font: 12px/20px var(--font-mono); color: var(--faint); }
|
|
71
|
+
.idea { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; font-size: 12px; line-height: 16px; color: var(--muted); }
|
|
72
|
+
.check { width: 14px; height: 14px; flex-shrink: 0; color: var(--muted); }
|
|
73
|
+
.act { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex-shrink: 0; padding: 0 8px; }
|
|
74
|
+
.button { display: inline-flex; align-items: center; gap: 8px; height: 32px; padding: 0 12px; border-radius: 8px; font-weight: 500; white-space: nowrap; }
|
|
75
|
+
.button .check { width: 16px; height: 16px; color: inherit; }
|
|
76
|
+
.primary { background: var(--primary); color: var(--on-primary); }
|
|
77
|
+
.primary:hover { background: color-mix(in srgb, var(--primary) 90%, transparent); }
|
|
78
|
+
.outline { background: var(--background); box-shadow: 0 0 0 1px var(--edge), 0 1px 2px 0 rgb(0 0 0 / 0.05); }
|
|
79
|
+
.button:disabled { opacity: 0.4; }
|
|
80
|
+
.said { max-width: 208px; text-align: right; }
|
|
81
|
+
.empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; height: 100%; padding: 0 24px; text-align: center; }
|
|
82
|
+
.empty p { margin: 0; }
|
|
83
|
+
.empty .title { font-weight: 500; }
|
|
84
|
+
.empty .text { max-width: 320px; color: var(--muted); text-wrap: pretty; }
|
|
85
|
+
@media (prefers-reduced-motion: reduce) { * { transition: none !important; } }
|
|
86
|
+
`;
|
|
87
|
+
const SCRIPT = `
|
|
88
|
+
const CHECK = '<svg class="check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
89
|
+
const nav = document.getElementById('rounds');
|
|
90
|
+
const sheet = document.getElementById('sheet');
|
|
91
|
+
let rounds = [];
|
|
92
|
+
let loaded = false;
|
|
93
|
+
const params = new URLSearchParams(location.search);
|
|
94
|
+
let roundId = params.get('round');
|
|
95
|
+
// The direction the address asks for, by its number in the round, as the agent opens each one to look at it.
|
|
96
|
+
const asked = Number(params.get('direction') ?? 1) - 1;
|
|
97
|
+
let shown = 0;
|
|
98
|
+
let said = '';
|
|
99
|
+
|
|
100
|
+
function element(tag, className, text) {
|
|
101
|
+
const made = document.createElement(tag);
|
|
102
|
+
if (className) made.className = className;
|
|
103
|
+
if (text !== undefined) made.textContent = text;
|
|
104
|
+
return made;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function current() {
|
|
108
|
+
return rounds.find((round) => round.id === roundId);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function when(at) {
|
|
112
|
+
const date = new Date(at);
|
|
113
|
+
const time = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
114
|
+
const days = Math.round((new Date().setHours(0, 0, 0, 0) - new Date(at).setHours(0, 0, 0, 0)) / 86400000);
|
|
115
|
+
if (days === 0) return 'Today, ' + time;
|
|
116
|
+
if (days === 1) return 'Yesterday, ' + time;
|
|
117
|
+
return date.toLocaleDateString([], { day: 'numeric', month: 'long' });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function open(id, index = 0) {
|
|
121
|
+
roundId = id;
|
|
122
|
+
show(index);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function show(index) {
|
|
126
|
+
const round = current();
|
|
127
|
+
shown = round && index >= 0 && index < round.directions.length ? index : 0;
|
|
128
|
+
said = '';
|
|
129
|
+
const url = new URL(location.href);
|
|
130
|
+
if (roundId) url.searchParams.set('round', roundId);
|
|
131
|
+
url.searchParams.set('direction', String(shown + 1));
|
|
132
|
+
history.replaceState(null, '', url);
|
|
133
|
+
render();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function renderRounds() {
|
|
137
|
+
nav.querySelectorAll('.round').forEach((row) => row.remove());
|
|
138
|
+
for (const round of rounds) {
|
|
139
|
+
const row = element('button', 'round');
|
|
140
|
+
row.type = 'button';
|
|
141
|
+
row.setAttribute('aria-current', String(round.id === roundId));
|
|
142
|
+
row.append(element('span', 'truncate', round.title));
|
|
143
|
+
const status = round.picked ? 'Picked ' + round.picked : round.directions.length + ' to pick from';
|
|
144
|
+
row.append(element('span', 'truncate small faint', status + ' · ' + when(round.at)));
|
|
145
|
+
row.onclick = () => open(round.id);
|
|
146
|
+
nav.append(row);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function renderSheet() {
|
|
151
|
+
const round = current();
|
|
152
|
+
if (!round) {
|
|
153
|
+
sheet.replaceChildren(empty());
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
document.title = round.title + ' · Directions';
|
|
157
|
+
const direction = round.directions[shown];
|
|
158
|
+
const src = 'rounds/' + round.id + '/' + (shown + 1);
|
|
159
|
+
let frame = sheet.querySelector('iframe');
|
|
160
|
+
if (!frame) frame = element('iframe');
|
|
161
|
+
if (frame.getAttribute('src') !== src) {
|
|
162
|
+
frame.setAttribute('src', src);
|
|
163
|
+
frame.title = direction.name;
|
|
164
|
+
}
|
|
165
|
+
// The page holds no secret of the viewer's, and runs on an origin of its own besides.
|
|
166
|
+
frame.setAttribute('sandbox', 'allow-scripts allow-forms allow-popups');
|
|
167
|
+
sheet.replaceChildren(frame, dock(round));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function dock(round) {
|
|
171
|
+
const options = element('div', 'options');
|
|
172
|
+
round.directions.forEach((direction, index) => {
|
|
173
|
+
const option = element('button', 'option');
|
|
174
|
+
option.type = 'button';
|
|
175
|
+
option.title = direction.idea;
|
|
176
|
+
option.setAttribute('aria-pressed', String(index === shown));
|
|
177
|
+
const head = element('span', 'option-head');
|
|
178
|
+
head.append(element('span', 'option-name', direction.name));
|
|
179
|
+
if (direction.name === round.picked) head.insertAdjacentHTML('beforeend', CHECK);
|
|
180
|
+
head.append(element('span', 'option-number', String(index + 1)));
|
|
181
|
+
option.append(head, element('span', 'idea', direction.idea));
|
|
182
|
+
option.onclick = () => show(index);
|
|
183
|
+
options.append(option);
|
|
184
|
+
});
|
|
185
|
+
const act = element('div', 'act');
|
|
186
|
+
const name = round.directions[shown].name;
|
|
187
|
+
const button = element('button', 'button');
|
|
188
|
+
button.type = 'button';
|
|
189
|
+
if (name === round.picked) {
|
|
190
|
+
button.className = 'button outline';
|
|
191
|
+
button.disabled = true;
|
|
192
|
+
button.innerHTML = CHECK;
|
|
193
|
+
button.append('Picked');
|
|
194
|
+
} else {
|
|
195
|
+
button.className = 'button primary';
|
|
196
|
+
button.textContent = round.picked ? 'Pick ' + name + ' instead' : 'Pick ' + name;
|
|
197
|
+
button.onclick = () => pick(round, name);
|
|
198
|
+
}
|
|
199
|
+
act.append(button);
|
|
200
|
+
if (said) act.append(element('span', 'said small faint', said));
|
|
201
|
+
const switcher = element('div', 'switcher');
|
|
202
|
+
switcher.append(options, act);
|
|
203
|
+
const wrapper = element('div', 'dock');
|
|
204
|
+
wrapper.append(switcher);
|
|
205
|
+
return wrapper;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function empty(title = 'No directions yet', text = 'When Jinion offers you directions for this project, each round shows here to compare and pick from.') {
|
|
209
|
+
const box = element('div', 'empty');
|
|
210
|
+
box.append(element('p', 'title', title), element('p', 'text', text));
|
|
211
|
+
return box;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function pick(round, name) {
|
|
215
|
+
try {
|
|
216
|
+
const response = await fetch('rounds/' + round.id + '/pick', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ direction: name }) });
|
|
217
|
+
if (!response.ok) throw new Error(String(response.status));
|
|
218
|
+
const answer = await response.json();
|
|
219
|
+
rounds = rounds.map((each) => (each.id === answer.round.id ? answer.round : each));
|
|
220
|
+
said = answer.sent ? '' : "Saved. Its conversation isn't open, so tell Jinion there.";
|
|
221
|
+
} catch {
|
|
222
|
+
said = "Jinion couldn't be reached. Is it still running?";
|
|
223
|
+
}
|
|
224
|
+
render();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function render() {
|
|
228
|
+
document.body.classList.toggle('sidebar-closed', location.hash === '#sidebar-closed');
|
|
229
|
+
renderRounds();
|
|
230
|
+
renderSheet();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async function load() {
|
|
234
|
+
try {
|
|
235
|
+
const known = new Set(rounds.map((round) => round.id));
|
|
236
|
+
const response = await fetch('rounds');
|
|
237
|
+
if (!response.ok) throw new Error(String(response.status));
|
|
238
|
+
const fresh = await response.json();
|
|
239
|
+
const first = !loaded;
|
|
240
|
+
loaded = true;
|
|
241
|
+
rounds = fresh;
|
|
242
|
+
const added = fresh.find((round) => !known.has(round.id));
|
|
243
|
+
// A round shown while the viewer is open comes up by itself.
|
|
244
|
+
if (!first && added) return open(added.id);
|
|
245
|
+
if (!current()) roundId = rounds[0] ? rounds[0].id : null;
|
|
246
|
+
if (first) return roundId ? open(roundId, asked) : render();
|
|
247
|
+
renderRounds();
|
|
248
|
+
} catch {
|
|
249
|
+
if (rounds.length === 0) sheet.replaceChildren(empty("Jinion isn't running", 'The directions show while Jinion runs. Start it again, then reload this page.'));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
addEventListener('hashchange', render);
|
|
254
|
+
addEventListener('keydown', (event) => {
|
|
255
|
+
const round = current();
|
|
256
|
+
if (!round || event.metaKey || event.ctrlKey || event.altKey) return;
|
|
257
|
+
const count = round.directions.length;
|
|
258
|
+
const number = Number(event.key);
|
|
259
|
+
if (event.key === 'ArrowRight') show((shown + 1) % count);
|
|
260
|
+
else if (event.key === 'ArrowLeft') show((shown - 1 + count) % count);
|
|
261
|
+
else if (number >= 1 && number <= count) show(number - 1);
|
|
262
|
+
});
|
|
263
|
+
load();
|
|
264
|
+
setInterval(load, 2000);
|
|
265
|
+
`;
|
|
266
|
+
//# sourceMappingURL=viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/directions/viewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO;;;;;;SAMA,KAAK;;;iFAGmE,UAAU,CAAC,OAAO,CAAC;;UAE1F,MAAM;;QAER,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Db,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLd,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The first name free in `folder`, as the Finder names a copy: with a word, `box copy.tsx`, then `box copy 2.tsx`;
|
|
3
|
+
* without one, `box.tsx` itself, then `box 2.tsx`.
|
|
4
|
+
*/
|
|
5
|
+
export declare function freeName(folder: string, name: string, word: string): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/files/names.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAexE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { lstat } from 'node:fs/promises';
|
|
2
|
+
import { extname, join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* The first name free in `folder`, as the Finder names a copy: with a word, `box copy.tsx`, then `box copy 2.tsx`;
|
|
5
|
+
* without one, `box.tsx` itself, then `box 2.tsx`.
|
|
6
|
+
*/
|
|
7
|
+
export async function freeName(folder, name, word) {
|
|
8
|
+
const extension = extname(name);
|
|
9
|
+
const stem = name.slice(0, name.length - extension.length);
|
|
10
|
+
for (let count = 1;; count++) {
|
|
11
|
+
const suffix = [word, count > 1 ? String(count) : ''].filter(Boolean).join(' ');
|
|
12
|
+
const candidate = suffix ? `${stem} ${suffix}${extension}` : name;
|
|
13
|
+
const taken = await lstat(join(folder, candidate)).then(() => true, () => false);
|
|
14
|
+
if (!taken)
|
|
15
|
+
return candidate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/files/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,IAAY;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE3D,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAElE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CACrD,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;QAEF,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { FileCreated, FilesCopied, FilesMoved, FilesRestored, Trashed } from './types.js';
|
|
2
|
+
/** Why an operation was refused, for the API to tell as its own error. */
|
|
3
|
+
export declare class FileProblem extends Error {
|
|
4
|
+
readonly kind: 'missing' | 'taken' | 'invalid';
|
|
5
|
+
readonly path?: string | undefined;
|
|
6
|
+
constructor(kind: 'missing' | 'taken' | 'invalid', message: string, path?: string | undefined);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* What can change which files a folder holds: each keeps to the folder, by real paths, so neither `..` nor a link
|
|
10
|
+
* leads out of it, and a name already taken is refused unless `replace` says to move what holds it to the Trash.
|
|
11
|
+
*/
|
|
12
|
+
export declare class FolderFiles {
|
|
13
|
+
private readonly root;
|
|
14
|
+
private constructor();
|
|
15
|
+
static of(folder: string): Promise<FolderFiles>;
|
|
16
|
+
/** A file, empty or with `content`, or a folder; the folders it is in are made as needed. */
|
|
17
|
+
create(path: string, { folder, content, replace }: {
|
|
18
|
+
folder?: boolean;
|
|
19
|
+
content?: Buffer;
|
|
20
|
+
replace?: boolean;
|
|
21
|
+
}): Promise<FileCreated>;
|
|
22
|
+
/** Gives a file or folder another name where it is. */
|
|
23
|
+
rename(path: string, name: string, replace?: boolean): Promise<FilesMoved>;
|
|
24
|
+
/**
|
|
25
|
+
* Moves files and folders into a folder of the session's, each keeping its name; with `keepBoth`, one whose name is
|
|
26
|
+
* taken there takes the next free one, as the Finder's Keep Both names it, `box 2.tsx`.
|
|
27
|
+
*/
|
|
28
|
+
move(paths: string[], into: string, replace?: boolean, keepBoth?: boolean): Promise<FilesMoved>;
|
|
29
|
+
/**
|
|
30
|
+
* Copies files and folders into a folder of the session's: ones of the folder by their paths in it, others, as files
|
|
31
|
+
* dropped from the Finder, by their whole paths. Copied into the folder it is in, a copy takes a name of its own, as
|
|
32
|
+
* one whose name is taken does with `keepBoth`.
|
|
33
|
+
*/
|
|
34
|
+
copy(paths: string[], into: string, replace?: boolean, keepBoth?: boolean): Promise<FilesCopied>;
|
|
35
|
+
/** Moves files and folders to the Trash. */
|
|
36
|
+
delete(paths: string[]): Promise<{
|
|
37
|
+
path: string;
|
|
38
|
+
trash: string;
|
|
39
|
+
}[]>;
|
|
40
|
+
/** Puts back what `delete` or a replace sent to the Trash, at the path it had. */
|
|
41
|
+
restore(items: Trashed[], replace?: boolean): Promise<FilesRestored>;
|
|
42
|
+
/** A folder of the session's by its path there, `''` for the folder itself, as a whole path. */
|
|
43
|
+
folderAt(path: string): Promise<string>;
|
|
44
|
+
private relocate;
|
|
45
|
+
private notInto;
|
|
46
|
+
/** What holds `target`, to the Trash when `replace` says so. */
|
|
47
|
+
private clear;
|
|
48
|
+
private existing;
|
|
49
|
+
private outside;
|
|
50
|
+
/** Where something new goes: under the deepest folder of its path that is there, which has to be in the folder. */
|
|
51
|
+
private target;
|
|
52
|
+
private named;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/files/operations.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAS,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtG,0EAA0E;AAC1E,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAE9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAHxB,YACW,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA,EAGvB;CACF;AAED;;;GAGG;AACH,qBAAa,WAAW;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAzC,OAAO,eAA8C;IAErD,OAAa,EAAE,CAAC,MAAM,EAAE,MAAM,wBAE7B;IAED,6FAA6F;IACvF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAc,EAAE,OAAO,EAAE,OAAe,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAUxJ;IAED,uDAAuD;IACjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E;IAED;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAQhG;IAED;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAkBjG;IAED,4CAA4C;IACtC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;;;SAO3B;IAED,kFAAkF;IAC5E,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAcvE;IAED,gGAAgG;IAC1F,QAAQ,CAAC,IAAI,EAAE,MAAM,mBAO1B;YAEa,QAAQ;IAiBtB,OAAO,CAAC,OAAO;IAIf,gEAAgE;YAClD,KAAK;YAQL,QAAQ;YAUR,OAAO;IAMrB,mHAAmH;YACrG,MAAM;IAcpB,OAAO,CAAC,KAAK;CAGd"}
|