bonecode 1.0.0 → 1.1.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/LICENSE +21 -0
- package/README.md +64 -50
- package/bone/output/agent/.dockerignore +7 -7
- package/bone/output/agent/.env.example +36 -36
- package/bone/output/agent/.github/workflows/ci.yaml +58 -58
- package/bone/output/agent/AgentDomain.bone.map +349 -349
- package/bone/output/agent/AgentDomain.postman_collection.json +957 -957
- package/bone/output/agent/Dockerfile +22 -22
- package/bone/output/agent/README.md +47 -47
- package/bone/output/agent/admin/index.html +739 -739
- package/bone/output/agent/docker-compose.yaml +22 -22
- package/bone/output/agent/k8s/deployment.yaml +75 -75
- package/bone/output/agent/migrations/agent.sql +36 -36
- package/bone/output/agent/migrations/agent_instance.sql +36 -36
- package/bone/output/agent/migrations/audit_log.sql +18 -18
- package/bone/output/agent/migrations/build_step.sql +34 -34
- package/bone/output/agent/migrations/event_outbox.sql +31 -31
- package/bone/output/agent/migrations/plan.sql +30 -30
- package/bone/output/agent/migrations/task.sql +30 -30
- package/bone/output/agent/migrations/tool_call.sql +33 -33
- package/bone/output/agent/openapi.yaml +1116 -1116
- package/bone/output/agent/package.json +35 -35
- package/bone/output/agent/schema.graphql +233 -233
- package/bone/output/agent/sdk/client.ts +231 -231
- package/bone/output/agent/src/algorithms.ts +2 -2
- package/bone/output/agent/src/audit.ts +44 -44
- package/bone/output/agent/src/auth.ts +57 -57
- package/bone/output/agent/src/cron.ts +12 -12
- package/bone/output/agent/src/db.ts +31 -31
- package/bone/output/agent/src/debug.ts +66 -66
- package/bone/output/agent/src/events.ts +243 -243
- package/bone/output/agent/src/extensions.ts +54 -54
- package/bone/output/agent/src/failure_rules.ts +322 -322
- package/bone/output/agent/src/flows.ts +168 -168
- package/bone/output/agent/src/health.ts +43 -43
- package/bone/output/agent/src/index.ts +99 -99
- package/bone/output/agent/src/logger.ts +69 -66
- package/bone/output/agent/src/metrics.ts +75 -75
- package/bone/output/agent/src/migrate.ts +351 -351
- package/bone/output/agent/src/migration_diff.ts +108 -108
- package/bone/output/agent/src/notify.ts +125 -125
- package/bone/output/agent/src/routes/plan.ts +91 -91
- package/bone/output/agent/src/routes/task.ts +105 -105
- package/bone/output/agent/src/routes/tool_call.ts +166 -166
- package/bone/output/agent/src/schemas.ts +384 -384
- package/bone/output/agent/src/state_machines/agent_instance.ts +24 -24
- package/bone/output/agent/src/state_machines/build_step.ts +22 -22
- package/bone/output/agent/src/state_machines/plan.ts +22 -22
- package/bone/output/agent/src/state_machines/task.ts +22 -22
- package/bone/output/agent/src/state_machines/tool_call.ts +22 -22
- package/bone/output/agent/src/tests.ts +361 -361
- package/bone/output/agent/src/websocket.ts +200 -200
- package/bone/output/agent/tsconfig.json +24 -24
- package/bone/output/rag/.dockerignore +7 -7
- package/bone/output/rag/.env.example +36 -36
- package/bone/output/rag/.github/workflows/ci.yaml +58 -58
- package/bone/output/rag/Dockerfile +22 -22
- package/bone/output/rag/RAGDomain.bone.map +286 -286
- package/bone/output/rag/RAGDomain.postman_collection.json +922 -922
- package/bone/output/rag/README.md +47 -47
- package/bone/output/rag/admin/index.html +817 -817
- package/bone/output/rag/docker-compose.yaml +22 -22
- package/bone/output/rag/k8s/deployment.yaml +75 -75
- package/bone/output/rag/migrations/audit_log.sql +18 -18
- package/bone/output/rag/migrations/code_chunk.sql +34 -34
- package/bone/output/rag/migrations/code_file.sql +33 -33
- package/bone/output/rag/migrations/event_outbox.sql +31 -31
- package/bone/output/rag/migrations/indexing_job.sql +33 -33
- package/bone/output/rag/migrations/knowledge_base.sql +35 -35
- package/bone/output/rag/migrations/memory_entry.sql +34 -34
- package/bone/output/rag/openapi.yaml +1097 -1097
- package/bone/output/rag/package.json +35 -35
- package/bone/output/rag/schema.graphql +245 -245
- package/bone/output/rag/sdk/client.ts +234 -234
- package/bone/output/rag/src/algorithms.ts +2 -2
- package/bone/output/rag/src/audit.ts +37 -37
- package/bone/output/rag/src/auth.ts +57 -57
- package/bone/output/rag/src/cron.ts +12 -12
- package/bone/output/rag/src/db.ts +31 -31
- package/bone/output/rag/src/debug.ts +66 -66
- package/bone/output/rag/src/events.ts +243 -243
- package/bone/output/rag/src/extensions.ts +350 -350
- package/bone/output/rag/src/failure_rules.ts +314 -314
- package/bone/output/rag/src/flows.ts +239 -239
- package/bone/output/rag/src/health.ts +43 -43
- package/bone/output/rag/src/index.ts +94 -94
- package/bone/output/rag/src/logger.ts +69 -66
- package/bone/output/rag/src/metrics.ts +75 -75
- package/bone/output/rag/src/migrate.ts +363 -363
- package/bone/output/rag/src/migration_diff.ts +108 -108
- package/bone/output/rag/src/notify.ts +99 -99
- package/bone/output/rag/src/routes/code_chunk.ts +75 -75
- package/bone/output/rag/src/routes/code_file.ts +101 -101
- package/bone/output/rag/src/routes/indexing_job.ts +87 -87
- package/bone/output/rag/src/routes/knowledge_base.ts +230 -230
- package/bone/output/rag/src/routes/memory_entry.ts +87 -87
- package/bone/output/rag/src/schemas.ts +394 -394
- package/bone/output/rag/src/state_machines/code_file.ts +23 -23
- package/bone/output/rag/src/state_machines/indexing_job.ts +22 -22
- package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -23
- package/bone/output/rag/src/state_machines/memory_entry.ts +20 -20
- package/bone/output/rag/src/tests.ts +339 -339
- package/bone/output/rag/tsconfig.json +24 -24
- package/bone/output/session/.dockerignore +7 -7
- package/bone/output/session/.env.example +36 -36
- package/bone/output/session/.github/workflows/ci.yaml +58 -58
- package/bone/output/session/Dockerfile +22 -22
- package/bone/output/session/README.md +47 -47
- package/bone/output/session/SessionDomain.bone.map +349 -349
- package/bone/output/session/SessionDomain.postman_collection.json +957 -957
- package/bone/output/session/admin/index.html +666 -666
- package/bone/output/session/docker-compose.yaml +22 -22
- package/bone/output/session/k8s/deployment.yaml +75 -75
- package/bone/output/session/migrations/audit_log.sql +18 -18
- package/bone/output/session/migrations/event_outbox.sql +31 -31
- package/bone/output/session/migrations/message.sql +31 -31
- package/bone/output/session/migrations/part.sql +28 -28
- package/bone/output/session/migrations/permission.sql +28 -28
- package/bone/output/session/migrations/project.sql +28 -28
- package/bone/output/session/migrations/session.sql +38 -38
- package/bone/output/session/openapi.yaml +1101 -1101
- package/bone/output/session/package.json +35 -35
- package/bone/output/session/schema.graphql +222 -222
- package/bone/output/session/sdk/client.ts +225 -225
- package/bone/output/session/src/algorithms.ts +2 -2
- package/bone/output/session/src/audit.ts +44 -44
- package/bone/output/session/src/auth.ts +57 -57
- package/bone/output/session/src/cron.ts +12 -12
- package/bone/output/session/src/db.ts +31 -31
- package/bone/output/session/src/debug.ts +66 -66
- package/bone/output/session/src/events.ts +270 -270
- package/bone/output/session/src/extensions.ts +215 -215
- package/bone/output/session/src/failure_rules.ts +283 -283
- package/bone/output/session/src/flows.ts +168 -168
- package/bone/output/session/src/health.ts +43 -43
- package/bone/output/session/src/index.ts +99 -99
- package/bone/output/session/src/logger.ts +67 -66
- package/bone/output/session/src/metrics.ts +75 -75
- package/bone/output/session/src/migrate.ts +331 -331
- package/bone/output/session/src/migration_diff.ts +108 -108
- package/bone/output/session/src/notify.ts +112 -112
- package/bone/output/session/src/routes/message.ts +93 -93
- package/bone/output/session/src/routes/part.ts +79 -79
- package/bone/output/session/src/routes/permission.ts +79 -79
- package/bone/output/session/src/routes/project.ts +79 -79
- package/bone/output/session/src/routes/session.ts +294 -294
- package/bone/output/session/src/schemas.ts +357 -357
- package/bone/output/session/src/state_machines/session.ts +23 -23
- package/bone/output/session/src/tests.ts +325 -325
- package/bone/output/session/src/websocket.ts +223 -200
- package/bone/output/session/tsconfig.json +24 -24
- package/bone/output/workspace/.dockerignore +7 -7
- package/bone/output/workspace/.env.example +36 -36
- package/bone/output/workspace/.github/workflows/ci.yaml +58 -58
- package/bone/output/workspace/Dockerfile +22 -22
- package/bone/output/workspace/README.md +45 -45
- package/bone/output/workspace/WorkspaceDomain.bone.map +188 -188
- package/bone/output/workspace/WorkspaceDomain.postman_collection.json +620 -620
- package/bone/output/workspace/admin/index.html +484 -484
- package/bone/output/workspace/docker-compose.yaml +22 -22
- package/bone/output/workspace/k8s/deployment.yaml +75 -75
- package/bone/output/workspace/migrations/audit_log.sql +18 -18
- package/bone/output/workspace/migrations/codebase.sql +34 -34
- package/bone/output/workspace/migrations/event_outbox.sql +31 -31
- package/bone/output/workspace/migrations/snapshot.sql +32 -32
- package/bone/output/workspace/migrations/workspace.sql +33 -33
- package/bone/output/workspace/openapi.yaml +721 -721
- package/bone/output/workspace/package.json +35 -35
- package/bone/output/workspace/schema.graphql +153 -153
- package/bone/output/workspace/sdk/client.ts +155 -155
- package/bone/output/workspace/src/algorithms.ts +2 -2
- package/bone/output/workspace/src/audit.ts +37 -37
- package/bone/output/workspace/src/auth.ts +57 -57
- package/bone/output/workspace/src/cron.ts +12 -12
- package/bone/output/workspace/src/db.ts +31 -31
- package/bone/output/workspace/src/debug.ts +66 -66
- package/bone/output/workspace/src/events.ts +243 -243
- package/bone/output/workspace/src/extensions.ts +44 -44
- package/bone/output/workspace/src/failure_rules.ts +152 -152
- package/bone/output/workspace/src/health.ts +43 -43
- package/bone/output/workspace/src/index.ts +88 -88
- package/bone/output/workspace/src/logger.ts +69 -66
- package/bone/output/workspace/src/metrics.ts +75 -75
- package/bone/output/workspace/src/migrate.ts +219 -219
- package/bone/output/workspace/src/migration_diff.ts +108 -108
- package/bone/output/workspace/src/notify.ts +73 -73
- package/bone/output/workspace/src/routes/codebase.ts +87 -87
- package/bone/output/workspace/src/routes/snapshot.ts +127 -127
- package/bone/output/workspace/src/routes/workspace.ts +190 -190
- package/bone/output/workspace/src/schemas.ts +231 -231
- package/bone/output/workspace/src/state_machines/codebase.ts +21 -21
- package/bone/output/workspace/src/state_machines/snapshot.ts +20 -20
- package/bone/output/workspace/src/state_machines/workspace.ts +21 -21
- package/bone/output/workspace/src/tests.ts +248 -248
- package/bone/output/workspace/tsconfig.json +24 -24
- package/compat/opencode_adapter.ts +94 -17
- package/package.json +15 -2
- package/src/cli.ts +66 -107
- package/src/db_adapter.ts +354 -0
- package/src/engine/account/account.sql.ts +39 -39
- package/src/engine/account/account.ts +456 -456
- package/src/engine/account/repo.ts +166 -166
- package/src/engine/account/schema.ts +99 -99
- package/src/engine/account/url.ts +8 -8
- package/src/engine/acp/README.md +174 -174
- package/src/engine/acp/agent.ts +1968 -1968
- package/src/engine/acp/runtime.ts +22 -22
- package/src/engine/acp/session.ts +122 -122
- package/src/engine/acp/types.ts +24 -24
- package/src/engine/agent/agent.ts +463 -463
- package/src/engine/agent/generate.txt +75 -75
- package/src/engine/agent/prompt/compaction.txt +9 -9
- package/src/engine/agent/prompt/explore.txt +18 -18
- package/src/engine/agent/prompt/scout.txt +36 -36
- package/src/engine/agent/prompt/summary.txt +11 -11
- package/src/engine/agent/prompt/title.txt +44 -44
- package/src/engine/agent/subagent-permissions.ts +34 -34
- package/src/engine/auth/index.ts +96 -96
- package/src/engine/background/background/job.ts +200 -200
- package/src/engine/background/job.ts +200 -200
- package/src/engine/bus/bus-event.ts +45 -45
- package/src/engine/bus/global.ts +22 -22
- package/src/engine/bus/index.ts +203 -203
- package/src/engine/command/command/index.ts +181 -181
- package/src/engine/command/command/template/initialize.txt +66 -66
- package/src/engine/command/command/template/review.txt +101 -101
- package/src/engine/command/index.ts +181 -181
- package/src/engine/command/template/initialize.txt +66 -66
- package/src/engine/command/template/review.txt +101 -101
- package/src/engine/config/agent.ts +172 -172
- package/src/engine/config/attachment.ts +25 -25
- package/src/engine/config/command.ts +62 -62
- package/src/engine/config/config.ts +833 -833
- package/src/engine/config/console-state.ts +14 -14
- package/src/engine/config/entry-name.ts +16 -16
- package/src/engine/config/error.ts +23 -23
- package/src/engine/config/formatter.ts +13 -13
- package/src/engine/config/layout.ts +6 -6
- package/src/engine/config/lsp.ts +43 -43
- package/src/engine/config/managed.ts +71 -71
- package/src/engine/config/markdown.ts +96 -96
- package/src/engine/config/mcp.ts +56 -56
- package/src/engine/config/model-id.ts +5 -5
- package/src/engine/config/parse.ts +79 -79
- package/src/engine/config/paths.ts +45 -45
- package/src/engine/config/permission.ts +58 -58
- package/src/engine/config/plugin.ts +84 -84
- package/src/engine/config/provider.ts +111 -111
- package/src/engine/config/reference.ts +23 -23
- package/src/engine/config/server.ts +19 -19
- package/src/engine/config/skills.ts +14 -14
- package/src/engine/config/variable.ts +90 -90
- package/src/engine/control-plane/adapters/index.ts +41 -41
- package/src/engine/control-plane/adapters/worktree.ts +96 -96
- package/src/engine/control-plane/dev/README.md +19 -19
- package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -73
- package/src/engine/control-plane/schema.ts +14 -14
- package/src/engine/control-plane/types.ts +59 -59
- package/src/engine/control-plane/util.ts +39 -39
- package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -51
- package/src/engine/control-plane/workspace-context.ts +26 -26
- package/src/engine/control-plane/workspace.sql.ts +20 -20
- package/src/engine/control-plane/workspace.ts +1072 -1072
- package/src/engine/data-migration.ts +161 -161
- package/src/engine/effect/app-runtime.ts +143 -143
- package/src/engine/effect/bootstrap-runtime.ts +29 -29
- package/src/engine/effect/bridge.ts +84 -84
- package/src/engine/effect/config-service.ts +67 -67
- package/src/engine/effect/instance-ref.ts +11 -11
- package/src/engine/effect/instance-registry.ts +12 -12
- package/src/engine/effect/instance-state.ts +72 -72
- package/src/engine/effect/promise.ts +17 -17
- package/src/engine/effect/run-service.ts +47 -47
- package/src/engine/effect/runner.ts +217 -217
- package/src/engine/effect/runtime-flags.ts +74 -74
- package/src/engine/effect/service-use.ts +38 -38
- package/src/engine/env/index.ts +37 -37
- package/src/engine/event-v2-bridge.ts +89 -89
- package/src/engine/file/file/ignore.ts +81 -81
- package/src/engine/file/file/index.ts +651 -651
- package/src/engine/file/file/protected.ts +59 -59
- package/src/engine/file/file/ripgrep.ts +481 -481
- package/src/engine/file/file/watcher.ts +167 -167
- package/src/engine/file/ignore.ts +81 -81
- package/src/engine/file/index.ts +651 -651
- package/src/engine/file/protected.ts +59 -59
- package/src/engine/file/ripgrep.ts +481 -481
- package/src/engine/file/watcher.ts +167 -167
- package/src/engine/format/format/formatter.ts +404 -404
- package/src/engine/format/format/index.ts +209 -209
- package/src/engine/format/formatter.ts +404 -404
- package/src/engine/format/index.ts +209 -209
- package/src/engine/git/git/index.ts +347 -347
- package/src/engine/git/index.ts +347 -347
- package/src/engine/id/id.ts +80 -80
- package/src/engine/ide/index.ts +70 -70
- package/src/engine/image/image/image.ts +176 -176
- package/src/engine/image/image.ts +176 -176
- package/src/engine/index.ts +251 -251
- package/src/engine/installation/index.ts +327 -327
- package/src/engine/lsp/client.ts +707 -707
- package/src/engine/lsp/diagnostic.ts +29 -29
- package/src/engine/lsp/language.ts +121 -121
- package/src/engine/lsp/launch.ts +21 -21
- package/src/engine/lsp/lsp/client.ts +707 -707
- package/src/engine/lsp/lsp/diagnostic.ts +29 -29
- package/src/engine/lsp/lsp/language.ts +121 -121
- package/src/engine/lsp/lsp/launch.ts +21 -21
- package/src/engine/lsp/lsp/lsp.ts +507 -507
- package/src/engine/lsp/lsp/server.ts +2064 -2064
- package/src/engine/lsp/lsp.ts +507 -507
- package/src/engine/lsp/server.ts +2064 -2064
- package/src/engine/mcp/auth.ts +146 -146
- package/src/engine/mcp/index.ts +958 -958
- package/src/engine/mcp/mcp/auth.ts +146 -146
- package/src/engine/mcp/mcp/index.ts +958 -958
- package/src/engine/mcp/mcp/oauth-callback.ts +232 -232
- package/src/engine/mcp/mcp/oauth-provider.ts +214 -214
- package/src/engine/mcp/oauth-callback.ts +232 -232
- package/src/engine/mcp/oauth-provider.ts +214 -214
- package/src/engine/node.ts +6 -6
- package/src/engine/patch/index.ts +689 -689
- package/src/engine/patch/patch/index.ts +689 -689
- package/src/engine/permission/arity.ts +163 -163
- package/src/engine/permission/evaluate.ts +15 -15
- package/src/engine/permission/index.ts +306 -306
- package/src/engine/permission/permission/arity.ts +163 -163
- package/src/engine/permission/permission/evaluate.ts +15 -15
- package/src/engine/permission/permission/index.ts +306 -306
- package/src/engine/permission/permission/schema.ts +13 -13
- package/src/engine/permission/schema.ts +13 -13
- package/src/engine/plugin/azure.ts +26 -26
- package/src/engine/plugin/cloudflare.ts +76 -76
- package/src/engine/plugin/codex.ts +622 -622
- package/src/engine/plugin/digitalocean.ts +411 -411
- package/src/engine/plugin/github-copilot/copilot.ts +394 -394
- package/src/engine/plugin/github-copilot/models.ts +196 -196
- package/src/engine/plugin/index.ts +295 -295
- package/src/engine/plugin/install.ts +439 -439
- package/src/engine/plugin/loader.ts +216 -216
- package/src/engine/plugin/meta.ts +188 -188
- package/src/engine/plugin/shared.ts +323 -323
- package/src/engine/project/bootstrap-service.ts +9 -9
- package/src/engine/project/bootstrap.ts +75 -75
- package/src/engine/project/instance-context.ts +24 -24
- package/src/engine/project/instance-layer.ts +11 -11
- package/src/engine/project/instance-runtime.ts +16 -16
- package/src/engine/project/instance-store.ts +193 -193
- package/src/engine/project/project.sql.ts +17 -17
- package/src/engine/project/project.ts +537 -537
- package/src/engine/project/schema.ts +13 -13
- package/src/engine/project/vcs.ts +405 -405
- package/src/engine/provider/auth.ts +225 -225
- package/src/engine/provider/error.ts +204 -204
- package/src/engine/provider/model-status.ts +8 -8
- package/src/engine/provider/provider.ts +1843 -1843
- package/src/engine/provider/schema.ts +30 -30
- package/src/engine/provider/transform.ts +1376 -1376
- package/src/engine/pty/index.ts +365 -365
- package/src/engine/pty/input.ts +24 -24
- package/src/engine/pty/pty/index.ts +365 -365
- package/src/engine/pty/pty/input.ts +24 -24
- package/src/engine/pty/pty/pty.bun.ts +26 -26
- package/src/engine/pty/pty/pty.node.ts +27 -27
- package/src/engine/pty/pty/pty.ts +25 -25
- package/src/engine/pty/pty/schema.ts +14 -14
- package/src/engine/pty/pty/ticket.ts +68 -68
- package/src/engine/pty/pty.bun.ts +26 -26
- package/src/engine/pty/pty.node.ts +27 -27
- package/src/engine/pty/pty.ts +25 -25
- package/src/engine/pty/schema.ts +14 -14
- package/src/engine/pty/ticket.ts +68 -68
- package/src/engine/question/index.ts +213 -213
- package/src/engine/question/question/index.ts +213 -213
- package/src/engine/question/question/schema.ts +10 -10
- package/src/engine/question/schema.ts +10 -10
- package/src/engine/reference/reference/reference.ts +241 -241
- package/src/engine/reference/reference/repository-cache.ts +147 -147
- package/src/engine/reference/reference.ts +241 -241
- package/src/engine/reference/repository-cache.ts +147 -147
- package/src/engine/session/compaction.ts +651 -651
- package/src/engine/session/instruction.ts +238 -238
- package/src/engine/session/llm.ts +459 -459
- package/src/engine/session/message-error.ts +14 -14
- package/src/engine/session/message-v2.ts +1202 -1202
- package/src/engine/session/message.ts +146 -146
- package/src/engine/session/overflow.ts +32 -32
- package/src/engine/session/processor.ts +823 -823
- package/src/engine/session/prompt/anthropic.txt +105 -105
- package/src/engine/session/prompt/beast.txt +147 -147
- package/src/engine/session/prompt/build-switch.txt +5 -5
- package/src/engine/session/prompt/codex.txt +79 -79
- package/src/engine/session/prompt/copilot-gpt-5.txt +143 -143
- package/src/engine/session/prompt/default.txt +105 -105
- package/src/engine/session/prompt/gemini.txt +155 -155
- package/src/engine/session/prompt/gpt.txt +107 -107
- package/src/engine/session/prompt/kimi.txt +95 -95
- package/src/engine/session/prompt/max-steps.txt +15 -15
- package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -67
- package/src/engine/session/prompt/plan.txt +26 -26
- package/src/engine/session/prompt/trinity.txt +97 -97
- package/src/engine/session/prompt.ts +66 -9
- package/src/engine/session/retry.ts +200 -200
- package/src/engine/session/revert.ts +162 -162
- package/src/engine/session/run-state.ts +153 -153
- package/src/engine/session/schema.ts +26 -26
- package/src/engine/session/session.sql.ts +137 -137
- package/src/engine/session/session.ts +1011 -1011
- package/src/engine/session/status.ts +94 -94
- package/src/engine/session/summary.ts +164 -164
- package/src/engine/session/system.ts +84 -84
- package/src/engine/session/todo.ts +81 -81
- package/src/engine/share/session.ts +61 -61
- package/src/engine/share/share-next.ts +376 -376
- package/src/engine/share/share.sql.ts +13 -13
- package/src/engine/shell/shell/shell.ts +215 -215
- package/src/engine/shell/shell.ts +215 -215
- package/src/engine/skill/discovery.ts +116 -116
- package/src/engine/skill/index.ts +336 -336
- package/src/engine/skill/prompt/customize-opencode.md +377 -377
- package/src/engine/skill/skill/discovery.ts +116 -116
- package/src/engine/skill/skill/index.ts +336 -336
- package/src/engine/skill/skill/prompt/customize-opencode.md +377 -377
- package/src/engine/snapshot/index.ts +762 -762
- package/src/engine/snapshot/snapshot/index.ts +762 -762
- package/src/engine/sync/README.md +179 -179
- package/src/engine/sync/event.sql.ts +17 -17
- package/src/engine/sync/index.ts +410 -410
- package/src/engine/sync/schema.ts +11 -11
- package/src/engine/temporary.ts +33 -33
- package/src/engine/tool/apply_patch.ts +313 -313
- package/src/engine/tool/apply_patch.txt +33 -33
- package/src/engine/tool/edit.ts +711 -711
- package/src/engine/tool/edit.txt +10 -10
- package/src/engine/tool/external-directory.ts +49 -49
- package/src/engine/tool/glob.ts +103 -103
- package/src/engine/tool/glob.txt +6 -6
- package/src/engine/tool/grep.ts +156 -156
- package/src/engine/tool/grep.txt +8 -8
- package/src/engine/tool/invalid.ts +21 -21
- package/src/engine/tool/json-schema.ts +164 -164
- package/src/engine/tool/lsp.ts +113 -113
- package/src/engine/tool/lsp.txt +24 -24
- package/src/engine/tool/mcp-websearch.ts +96 -96
- package/src/engine/tool/plan-enter.txt +14 -14
- package/src/engine/tool/plan-exit.txt +13 -13
- package/src/engine/tool/plan.ts +78 -78
- package/src/engine/tool/question.ts +44 -44
- package/src/engine/tool/question.txt +10 -10
- package/src/engine/tool/read.ts +337 -337
- package/src/engine/tool/read.txt +14 -14
- package/src/engine/tool/registry.ts +472 -472
- package/src/engine/tool/repo_clone.ts +80 -80
- package/src/engine/tool/repo_clone.txt +5 -5
- package/src/engine/tool/repo_overview.ts +279 -279
- package/src/engine/tool/repo_overview.txt +4 -4
- package/src/engine/tool/schema.ts +14 -14
- package/src/engine/tool/shell/id.ts +19 -19
- package/src/engine/tool/shell/prompt.ts +295 -295
- package/src/engine/tool/shell/shell.txt +77 -77
- package/src/engine/tool/shell.ts +647 -647
- package/src/engine/tool/skill.ts +75 -75
- package/src/engine/tool/skill.txt +5 -5
- package/src/engine/tool/task.ts +337 -337
- package/src/engine/tool/task.txt +58 -58
- package/src/engine/tool/task_status.ts +179 -179
- package/src/engine/tool/task_status.txt +13 -13
- package/src/engine/tool/todo.ts +57 -57
- package/src/engine/tool/todowrite.txt +167 -167
- package/src/engine/tool/tool/apply_patch.ts +313 -313
- package/src/engine/tool/tool/apply_patch.txt +33 -33
- package/src/engine/tool/tool/edit.ts +711 -711
- package/src/engine/tool/tool/edit.txt +10 -10
- package/src/engine/tool/tool/external-directory.ts +49 -49
- package/src/engine/tool/tool/glob.ts +103 -103
- package/src/engine/tool/tool/glob.txt +6 -6
- package/src/engine/tool/tool/grep.ts +156 -156
- package/src/engine/tool/tool/grep.txt +8 -8
- package/src/engine/tool/tool/invalid.ts +21 -21
- package/src/engine/tool/tool/json-schema.ts +164 -164
- package/src/engine/tool/tool/lsp.ts +113 -113
- package/src/engine/tool/tool/lsp.txt +24 -24
- package/src/engine/tool/tool/mcp-websearch.ts +96 -96
- package/src/engine/tool/tool/plan-enter.txt +14 -14
- package/src/engine/tool/tool/plan-exit.txt +13 -13
- package/src/engine/tool/tool/plan.ts +78 -78
- package/src/engine/tool/tool/question.ts +44 -44
- package/src/engine/tool/tool/question.txt +10 -10
- package/src/engine/tool/tool/read.ts +337 -337
- package/src/engine/tool/tool/read.txt +14 -14
- package/src/engine/tool/tool/registry.ts +472 -472
- package/src/engine/tool/tool/repo_clone.ts +80 -80
- package/src/engine/tool/tool/repo_clone.txt +5 -5
- package/src/engine/tool/tool/repo_overview.ts +279 -279
- package/src/engine/tool/tool/repo_overview.txt +4 -4
- package/src/engine/tool/tool/schema.ts +14 -14
- package/src/engine/tool/tool/shell/id.ts +19 -19
- package/src/engine/tool/tool/shell/prompt.ts +295 -295
- package/src/engine/tool/tool/shell/shell.txt +77 -77
- package/src/engine/tool/tool/shell.ts +647 -647
- package/src/engine/tool/tool/skill.ts +75 -75
- package/src/engine/tool/tool/skill.txt +5 -5
- package/src/engine/tool/tool/task.ts +337 -337
- package/src/engine/tool/tool/task.txt +58 -58
- package/src/engine/tool/tool/task_status.ts +179 -179
- package/src/engine/tool/tool/task_status.txt +13 -13
- package/src/engine/tool/tool/todo.ts +57 -57
- package/src/engine/tool/tool/todowrite.txt +167 -167
- package/src/engine/tool/tool/tool.ts +164 -164
- package/src/engine/tool/tool/truncate.ts +160 -160
- package/src/engine/tool/tool/truncation-dir.ts +4 -4
- package/src/engine/tool/tool/webfetch.ts +192 -192
- package/src/engine/tool/tool/webfetch.txt +13 -13
- package/src/engine/tool/tool/websearch.ts +143 -143
- package/src/engine/tool/tool/websearch.txt +14 -14
- package/src/engine/tool/tool/write.ts +104 -104
- package/src/engine/tool/tool/write.txt +8 -8
- package/src/engine/tool/tool.ts +164 -164
- package/src/engine/tool/truncate.ts +160 -160
- package/src/engine/tool/truncation-dir.ts +4 -4
- package/src/engine/tool/webfetch.ts +192 -192
- package/src/engine/tool/webfetch.txt +13 -13
- package/src/engine/tool/websearch.ts +143 -143
- package/src/engine/tool/websearch.txt +14 -14
- package/src/engine/tool/write.ts +104 -104
- package/src/engine/tool/write.txt +8 -8
- package/src/engine/util/archive.ts +17 -17
- package/src/engine/util/bom.ts +31 -31
- package/src/engine/util/data-url.ts +9 -9
- package/src/engine/util/defer.ts +10 -10
- package/src/engine/util/effect-http-client.ts +11 -11
- package/src/engine/util/error.ts +88 -88
- package/src/engine/util/filesystem.ts +252 -252
- package/src/engine/util/format.ts +20 -20
- package/src/engine/util/iife.ts +3 -3
- package/src/engine/util/lazy.ts +20 -20
- package/src/engine/util/local-context.ts +25 -25
- package/src/engine/util/locale.ts +86 -86
- package/src/engine/util/media.ts +26 -26
- package/src/engine/util/process.ts +176 -176
- package/src/engine/util/queue.ts +32 -32
- package/src/engine/util/record.ts +3 -3
- package/src/engine/util/repository.ts +158 -158
- package/src/engine/util/rpc.ts +66 -66
- package/src/engine/util/signal.ts +12 -12
- package/src/engine/util/timeout.ts +13 -13
- package/src/engine/util/token.ts +7 -7
- package/src/engine/util/util/archive.ts +17 -17
- package/src/engine/util/util/bom.ts +31 -31
- package/src/engine/util/util/data-url.ts +9 -9
- package/src/engine/util/util/defer.ts +10 -10
- package/src/engine/util/util/effect-http-client.ts +11 -11
- package/src/engine/util/util/error.ts +88 -88
- package/src/engine/util/util/filesystem.ts +252 -252
- package/src/engine/util/util/format.ts +20 -20
- package/src/engine/util/util/iife.ts +3 -3
- package/src/engine/util/util/lazy.ts +20 -20
- package/src/engine/util/util/local-context.ts +25 -25
- package/src/engine/util/util/locale.ts +86 -86
- package/src/engine/util/util/media.ts +26 -26
- package/src/engine/util/util/process.ts +176 -176
- package/src/engine/util/util/queue.ts +32 -32
- package/src/engine/util/util/record.ts +3 -3
- package/src/engine/util/util/repository.ts +158 -158
- package/src/engine/util/util/rpc.ts +66 -66
- package/src/engine/util/util/signal.ts +12 -12
- package/src/engine/util/util/timeout.ts +13 -13
- package/src/engine/util/util/token.ts +7 -7
- package/src/engine/util/util/which.ts +14 -14
- package/src/engine/util/util/wildcard.ts +59 -59
- package/src/engine/util/which.ts +14 -14
- package/src/engine/util/wildcard.ts +59 -59
- package/src/engine/worktree/index.ts +621 -621
- package/src/server.ts +121 -158
- package/src/tui.ts +485 -502
|
@@ -1,485 +1,485 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<meta name="bonescript-api-url" content="http://localhost:3000" />
|
|
7
|
-
<title>WorkspaceDomain Admin</title>
|
|
8
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
9
|
-
<style>.loading{opacity:.5;pointer-events:none}.toast{animation:fadeout 3s forwards}@keyframes fadeout{0%,70%{opacity:1}100%{opacity:0}}</style>
|
|
10
|
-
</head>
|
|
11
|
-
<body class="bg-gray-50 min-h-screen">
|
|
12
|
-
<div class="flex h-screen overflow-hidden">
|
|
13
|
-
<aside class="w-64 bg-gray-900 text-white flex flex-col">
|
|
14
|
-
<div class="p-4 border-b border-gray-700"><h1 class="text-lg font-bold">WorkspaceDomain</h1><p class="text-xs text-gray-400 mt-1">Admin Panel</p></div>
|
|
15
|
-
<nav class="flex-1 overflow-y-auto p-2" id="nav"><button onclick="loadEntity('workspaces')" id="nav-workspaces" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Workspace</button>
|
|
16
|
-
<button onclick="loadEntity('codebases')" id="nav-codebases" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Codebase</button>
|
|
17
|
-
<button onclick="loadEntity('snapshots')" id="nav-snapshots" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Snapshot</button></nav>
|
|
18
|
-
<div class="p-4 border-t border-gray-700"><div class="text-xs text-gray-500"><div id="auth-status">Not authenticated</div>
|
|
19
|
-
<input id="token-input" type="password" placeholder="Bearer token" class="mt-2 w-full bg-gray-800 text-white text-xs px-2 py-1 rounded border border-gray-600" onchange="setToken(this.value)" /></div></div>
|
|
20
|
-
</aside>
|
|
21
|
-
<main class="flex-1 overflow-y-auto">
|
|
22
|
-
<div class="bg-white border-b px-6 py-4 flex items-center justify-between sticky top-0 z-10">
|
|
23
|
-
<div><h2 class="text-xl font-semibold text-gray-800" id="page-title">Select an entity</h2><p class="text-sm text-gray-500" id="page-subtitle"></p></div>
|
|
24
|
-
<div class="flex gap-2">
|
|
25
|
-
<button onclick="openCreateModal()" id="create-btn" class="hidden bg-blue-600 text-white px-4 py-2 rounded text-sm hover:bg-blue-700">+ Create</button>
|
|
26
|
-
<button onclick="refreshTable()" id="refresh-btn" class="hidden bg-gray-100 text-gray-700 px-3 py-2 rounded text-sm hover:bg-gray-200">↻ Refresh</button>
|
|
27
|
-
</div></div>
|
|
28
|
-
<div id="toast-container" class="fixed top-4 right-4 z-50 flex flex-col gap-2"></div>
|
|
29
|
-
<div class="p-6" id="content-area"><div class="text-center text-gray-400 mt-20"><div class="text-5xl mb-4">⚡</div><p class="text-lg">Select an entity from the sidebar</p><p class="text-sm mt-2">Generated by BoneScript compiler</p></div></div>
|
|
30
|
-
</main></div>
|
|
31
|
-
<div id="modal" class="hidden fixed inset-0 bg-black bg-opacity-50 z-40 flex items-center justify-center p-4"><div class="bg-white rounded-lg shadow-xl w-full max-w-lg max-h-screen overflow-y-auto"><div class="p-6"><div class="flex items-center justify-between mb-4"><h3 class="text-lg font-semibold" id="modal-title">Create</h3><button onclick="closeModal()" class="text-gray-400 hover:text-gray-600 text-2xl">×</button></div><form id="modal-form" onsubmit="submitForm(event)" class="space-y-4"><div id="form-fields"></div><div class="flex gap-2 pt-2"><button type="submit" class="flex-1 bg-blue-600 text-white py-2 rounded hover:bg-blue-700">Save</button><button type="button" onclick="closeModal()" class="flex-1 bg-gray-100 text-gray-700 py-2 rounded hover:bg-gray-200">Cancel</button></div></form></div></div></div>
|
|
32
|
-
<div id="cap-modal" class="hidden fixed inset-0 bg-black bg-opacity-50 z-40 flex items-center justify-center p-4"><div class="bg-white rounded-lg shadow-xl w-full max-w-md"><div class="p-6"><div class="flex items-center justify-between mb-4"><h3 class="text-lg font-semibold" id="cap-modal-title">Run Capability</h3><button onclick="closeCapModal()" class="text-gray-400 hover:text-gray-600 text-2xl">×</button></div><p class="text-sm text-gray-500 mb-4" id="cap-modal-desc"></p><div class="flex gap-2"><button onclick="confirmCapability()" class="flex-1 bg-orange-500 text-white py-2 rounded hover:bg-orange-600">Run</button><button onclick="closeCapModal()" class="flex-1 bg-gray-100 text-gray-700 py-2 rounded hover:bg-gray-200">Cancel</button></div></div></div></div>
|
|
33
|
-
<script>const BASE_URL = (document.querySelector('meta[name="bonescript-api-url"]') || {}).content || "http://localhost:3000";
|
|
34
|
-
const ENTITIES = [
|
|
35
|
-
{
|
|
36
|
-
"name": "Workspace",
|
|
37
|
-
"tableName": "workspaces",
|
|
38
|
-
"apiPath": "/workspaces",
|
|
39
|
-
"columns": [
|
|
40
|
-
{
|
|
41
|
-
"key": "id",
|
|
42
|
-
"label": "Id",
|
|
43
|
-
"type": "uuid",
|
|
44
|
-
"nullable": false
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"key": "created_at",
|
|
48
|
-
"label": "Created At",
|
|
49
|
-
"type": "datetime",
|
|
50
|
-
"nullable": false
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"key": "updated_at",
|
|
54
|
-
"label": "Updated At",
|
|
55
|
-
"type": "datetime",
|
|
56
|
-
"nullable": false
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"key": "project_id",
|
|
60
|
-
"label": "Project Id",
|
|
61
|
-
"type": "uuid",
|
|
62
|
-
"nullable": false
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
"key": "root_path",
|
|
66
|
-
"label": "Root Path",
|
|
67
|
-
"type": "text",
|
|
68
|
-
"nullable": false
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"key": "git_remote",
|
|
72
|
-
"label": "Git Remote",
|
|
73
|
-
"type": "text",
|
|
74
|
-
"nullable": true
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
"key": "git_branch",
|
|
78
|
-
"label": "Git Branch",
|
|
79
|
-
"type": "text",
|
|
80
|
-
"nullable": true
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"key": "git_commit",
|
|
84
|
-
"label": "Git Commit",
|
|
85
|
-
"type": "text",
|
|
86
|
-
"nullable": true
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
"key": "is_dirty",
|
|
90
|
-
"label": "Is Dirty",
|
|
91
|
-
"type": "boolean",
|
|
92
|
-
"nullable": false
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"key": "file_count",
|
|
96
|
-
"label": "File Count",
|
|
97
|
-
"type": "text",
|
|
98
|
-
"nullable": true
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"key": "total_size_bytes",
|
|
102
|
-
"label": "Total Size Bytes",
|
|
103
|
-
"type": "text",
|
|
104
|
-
"nullable": true
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"key": "config",
|
|
108
|
-
"label": "Config",
|
|
109
|
-
"type": "text",
|
|
110
|
-
"nullable": true
|
|
111
|
-
}
|
|
112
|
-
],
|
|
113
|
-
"formFields": [
|
|
114
|
-
{
|
|
115
|
-
"key": "project_id",
|
|
116
|
-
"label": "Project Id",
|
|
117
|
-
"type": "uuid",
|
|
118
|
-
"nullable": false
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"key": "root_path",
|
|
122
|
-
"label": "Root Path",
|
|
123
|
-
"type": "text",
|
|
124
|
-
"nullable": false
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
"key": "git_remote",
|
|
128
|
-
"label": "Git Remote",
|
|
129
|
-
"type": "text",
|
|
130
|
-
"nullable": true
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
"key": "git_branch",
|
|
134
|
-
"label": "Git Branch",
|
|
135
|
-
"type": "text",
|
|
136
|
-
"nullable": true
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
"key": "git_commit",
|
|
140
|
-
"label": "Git Commit",
|
|
141
|
-
"type": "text",
|
|
142
|
-
"nullable": true
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"key": "is_dirty",
|
|
146
|
-
"label": "Is Dirty",
|
|
147
|
-
"type": "boolean",
|
|
148
|
-
"nullable": false
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"key": "file_count",
|
|
152
|
-
"label": "File Count",
|
|
153
|
-
"type": "text",
|
|
154
|
-
"nullable": true
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"key": "total_size_bytes",
|
|
158
|
-
"label": "Total Size Bytes",
|
|
159
|
-
"type": "text",
|
|
160
|
-
"nullable": true
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"key": "config",
|
|
164
|
-
"label": "Config",
|
|
165
|
-
"type": "text",
|
|
166
|
-
"nullable": true
|
|
167
|
-
}
|
|
168
|
-
],
|
|
169
|
-
"capabilities": [
|
|
170
|
-
{
|
|
171
|
-
"name": "create_snapshot",
|
|
172
|
-
"label": "Create Snapshot",
|
|
173
|
-
"endpoint": "/workspaces/create-snapshot"
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
"name": "revert_to_snapshot",
|
|
177
|
-
"label": "Revert To Snapshot",
|
|
178
|
-
"endpoint": "/workspaces/revert-to-snapshot"
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
"name": "analyze_codebase",
|
|
182
|
-
"label": "Analyze Codebase",
|
|
183
|
-
"endpoint": "/workspaces/analyze-codebase"
|
|
184
|
-
}
|
|
185
|
-
]
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
"name": "Codebase",
|
|
189
|
-
"tableName": "codebases",
|
|
190
|
-
"apiPath": "/codebases",
|
|
191
|
-
"columns": [
|
|
192
|
-
{
|
|
193
|
-
"key": "id",
|
|
194
|
-
"label": "Id",
|
|
195
|
-
"type": "uuid",
|
|
196
|
-
"nullable": false
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
"key": "created_at",
|
|
200
|
-
"label": "Created At",
|
|
201
|
-
"type": "datetime",
|
|
202
|
-
"nullable": false
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
"key": "updated_at",
|
|
206
|
-
"label": "Updated At",
|
|
207
|
-
"type": "datetime",
|
|
208
|
-
"nullable": false
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
"key": "workspace_id",
|
|
212
|
-
"label": "Workspace Id",
|
|
213
|
-
"type": "uuid",
|
|
214
|
-
"nullable": false
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
"key": "project_id",
|
|
218
|
-
"label": "Project Id",
|
|
219
|
-
"type": "uuid",
|
|
220
|
-
"nullable": false
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"key": "primary_language",
|
|
224
|
-
"label": "Primary Language",
|
|
225
|
-
"type": "text",
|
|
226
|
-
"nullable": true
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
"key": "languages",
|
|
230
|
-
"label": "Languages",
|
|
231
|
-
"type": "text",
|
|
232
|
-
"nullable": true
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
"key": "framework",
|
|
236
|
-
"label": "Framework",
|
|
237
|
-
"type": "text",
|
|
238
|
-
"nullable": true
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
"key": "build_tool",
|
|
242
|
-
"label": "Build Tool",
|
|
243
|
-
"type": "text",
|
|
244
|
-
"nullable": true
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
"key": "test_framework",
|
|
248
|
-
"label": "Test Framework",
|
|
249
|
-
"type": "text",
|
|
250
|
-
"nullable": true
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
"key": "entry_points",
|
|
254
|
-
"label": "Entry Points",
|
|
255
|
-
"type": "text",
|
|
256
|
-
"nullable": true
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
"key": "dependencies",
|
|
260
|
-
"label": "Dependencies",
|
|
261
|
-
"type": "text",
|
|
262
|
-
"nullable": true
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
"key": "analysis_version",
|
|
266
|
-
"label": "Analysis Version",
|
|
267
|
-
"type": "text",
|
|
268
|
-
"nullable": true
|
|
269
|
-
}
|
|
270
|
-
],
|
|
271
|
-
"formFields": [
|
|
272
|
-
{
|
|
273
|
-
"key": "workspace_id",
|
|
274
|
-
"label": "Workspace Id",
|
|
275
|
-
"type": "uuid",
|
|
276
|
-
"nullable": false
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
"key": "project_id",
|
|
280
|
-
"label": "Project Id",
|
|
281
|
-
"type": "uuid",
|
|
282
|
-
"nullable": false
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
"key": "primary_language",
|
|
286
|
-
"label": "Primary Language",
|
|
287
|
-
"type": "text",
|
|
288
|
-
"nullable": true
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
"key": "languages",
|
|
292
|
-
"label": "Languages",
|
|
293
|
-
"type": "text",
|
|
294
|
-
"nullable": true
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
"key": "framework",
|
|
298
|
-
"label": "Framework",
|
|
299
|
-
"type": "text",
|
|
300
|
-
"nullable": true
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
"key": "build_tool",
|
|
304
|
-
"label": "Build Tool",
|
|
305
|
-
"type": "text",
|
|
306
|
-
"nullable": true
|
|
307
|
-
},
|
|
308
|
-
{
|
|
309
|
-
"key": "test_framework",
|
|
310
|
-
"label": "Test Framework",
|
|
311
|
-
"type": "text",
|
|
312
|
-
"nullable": true
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
"key": "entry_points",
|
|
316
|
-
"label": "Entry Points",
|
|
317
|
-
"type": "text",
|
|
318
|
-
"nullable": true
|
|
319
|
-
},
|
|
320
|
-
{
|
|
321
|
-
"key": "dependencies",
|
|
322
|
-
"label": "Dependencies",
|
|
323
|
-
"type": "text",
|
|
324
|
-
"nullable": true
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
"key": "analysis_version",
|
|
328
|
-
"label": "Analysis Version",
|
|
329
|
-
"type": "text",
|
|
330
|
-
"nullable": true
|
|
331
|
-
}
|
|
332
|
-
],
|
|
333
|
-
"capabilities": []
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
"name": "Snapshot",
|
|
337
|
-
"tableName": "snapshots",
|
|
338
|
-
"apiPath": "/snapshots",
|
|
339
|
-
"columns": [
|
|
340
|
-
{
|
|
341
|
-
"key": "id",
|
|
342
|
-
"label": "Id",
|
|
343
|
-
"type": "uuid",
|
|
344
|
-
"nullable": false
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"key": "created_at",
|
|
348
|
-
"label": "Created At",
|
|
349
|
-
"type": "datetime",
|
|
350
|
-
"nullable": false
|
|
351
|
-
},
|
|
352
|
-
{
|
|
353
|
-
"key": "updated_at",
|
|
354
|
-
"label": "Updated At",
|
|
355
|
-
"type": "datetime",
|
|
356
|
-
"nullable": false
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
"key": "session_id",
|
|
360
|
-
"label": "Session Id",
|
|
361
|
-
"type": "uuid",
|
|
362
|
-
"nullable": false
|
|
363
|
-
},
|
|
364
|
-
{
|
|
365
|
-
"key": "project_id",
|
|
366
|
-
"label": "Project Id",
|
|
367
|
-
"type": "uuid",
|
|
368
|
-
"nullable": false
|
|
369
|
-
},
|
|
370
|
-
{
|
|
371
|
-
"key": "workspace_id",
|
|
372
|
-
"label": "Workspace Id",
|
|
373
|
-
"type": "uuid",
|
|
374
|
-
"nullable": false
|
|
375
|
-
},
|
|
376
|
-
{
|
|
377
|
-
"key": "git_hash",
|
|
378
|
-
"label": "Git Hash",
|
|
379
|
-
"type": "text",
|
|
380
|
-
"nullable": false
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
"key": "message_id",
|
|
384
|
-
"label": "Message Id",
|
|
385
|
-
"type": "text",
|
|
386
|
-
"nullable": true
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
"key": "part_id",
|
|
390
|
-
"label": "Part Id",
|
|
391
|
-
"type": "text",
|
|
392
|
-
"nullable": true
|
|
393
|
-
},
|
|
394
|
-
{
|
|
395
|
-
"key": "diff_summary",
|
|
396
|
-
"label": "Diff Summary",
|
|
397
|
-
"type": "text",
|
|
398
|
-
"nullable": true
|
|
399
|
-
},
|
|
400
|
-
{
|
|
401
|
-
"key": "files_changed",
|
|
402
|
-
"label": "Files Changed",
|
|
403
|
-
"type": "text",
|
|
404
|
-
"nullable": true
|
|
405
|
-
}
|
|
406
|
-
],
|
|
407
|
-
"formFields": [
|
|
408
|
-
{
|
|
409
|
-
"key": "session_id",
|
|
410
|
-
"label": "Session Id",
|
|
411
|
-
"type": "uuid",
|
|
412
|
-
"nullable": false
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
"key": "project_id",
|
|
416
|
-
"label": "Project Id",
|
|
417
|
-
"type": "uuid",
|
|
418
|
-
"nullable": false
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
"key": "workspace_id",
|
|
422
|
-
"label": "Workspace Id",
|
|
423
|
-
"type": "uuid",
|
|
424
|
-
"nullable": false
|
|
425
|
-
},
|
|
426
|
-
{
|
|
427
|
-
"key": "git_hash",
|
|
428
|
-
"label": "Git Hash",
|
|
429
|
-
"type": "text",
|
|
430
|
-
"nullable": false
|
|
431
|
-
},
|
|
432
|
-
{
|
|
433
|
-
"key": "message_id",
|
|
434
|
-
"label": "Message Id",
|
|
435
|
-
"type": "text",
|
|
436
|
-
"nullable": true
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
"key": "part_id",
|
|
440
|
-
"label": "Part Id",
|
|
441
|
-
"type": "text",
|
|
442
|
-
"nullable": true
|
|
443
|
-
},
|
|
444
|
-
{
|
|
445
|
-
"key": "diff_summary",
|
|
446
|
-
"label": "Diff Summary",
|
|
447
|
-
"type": "text",
|
|
448
|
-
"nullable": true
|
|
449
|
-
},
|
|
450
|
-
{
|
|
451
|
-
"key": "files_changed",
|
|
452
|
-
"label": "Files Changed",
|
|
453
|
-
"type": "text",
|
|
454
|
-
"nullable": true
|
|
455
|
-
}
|
|
456
|
-
],
|
|
457
|
-
"capabilities": [
|
|
458
|
-
{
|
|
459
|
-
"name": "revert_to_snapshot",
|
|
460
|
-
"label": "Revert To Snapshot",
|
|
461
|
-
"endpoint": "/snapshots/revert-to-snapshot"
|
|
462
|
-
}
|
|
463
|
-
]
|
|
464
|
-
}
|
|
465
|
-
];
|
|
466
|
-
let currentEntity = null, currentPage = 1, editingId = null, pendingCapability = null;
|
|
467
|
-
let authToken = localStorage.getItem("admin_token") || "";
|
|
468
|
-
if (authToken) { document.getElementById("token-input").value = authToken; document.getElementById("auth-status").textContent = "Token set"; }
|
|
469
|
-
function setToken(v) { authToken = v; localStorage.setItem("admin_token", v); document.getElementById("auth-status").textContent = v ? "Token set" : "Not authenticated"; }
|
|
470
|
-
function headers() { const h = { "Content-Type": "application/json" }; if (authToken) h["Authorization"] = "Bearer " + authToken; return h; }
|
|
471
|
-
function toast(msg, type) { const el = document.createElement("div"); el.className = "toast px-4 py-2 rounded shadow text-sm text-white " + (type === "error" ? "bg-red-500" : "bg-green-500"); el.textContent = msg; document.getElementById("toast-container").appendChild(el); setTimeout(function() { el.remove(); }, 3500); }
|
|
472
|
-
function loadEntity(t) { currentEntity = ENTITIES.find(function(e) { return e.tableName === t; }); if (!currentEntity) return; currentPage = 1; document.querySelectorAll("[id^=nav-]").forEach(function(el) { el.classList.remove("bg-gray-700", "text-white"); el.classList.add("text-gray-300"); }); var n = document.getElementById("nav-" + t); if (n) { n.classList.add("bg-gray-700", "text-white"); n.classList.remove("text-gray-300"); } document.getElementById("page-title").textContent = currentEntity.name; document.getElementById("page-subtitle").textContent = currentEntity.apiPath; document.getElementById("create-btn").classList.remove("hidden"); document.getElementById("refresh-btn").classList.remove("hidden"); refreshTable(); }
|
|
473
|
-
async function refreshTable() { if (!currentEntity) return; var area = document.getElementById("content-area"); area.classList.add("loading"); try { var res = await fetch(BASE_URL + currentEntity.apiPath + "?page=" + currentPage + "&page_size=50", { headers: headers() }); var data = await res.json(); if (!res.ok) { area.innerHTML = "<p class=\"text-red-600\">" + (data.error && data.error.message || "Error") + "</p>"; return; } var items = data.items || []; var total = data.total || 0; var cols = currentEntity.columns; var caps = currentEntity.capabilities; var html = "<div class=\"bg-white rounded-lg shadow overflow-hidden\"><div class=\"px-4 py-3 border-b flex items-center justify-between\"><span class=\"text-sm text-gray-500\">" + total + " total</span>"; if (caps.length > 0) { html += "<div class=\"flex gap-2\">"; for (var i = 0; i < caps.length; i++) { html += "<button onclick=\"runCapability('" + caps[i].endpoint + "','" + caps[i].label + "')\" class=\"text-xs bg-orange-100 text-orange-700 px-2 py-1 rounded\">" + caps[i].label + "</button>"; } html += "</div>"; } html += "</div><div class=\"overflow-x-auto\"><table class=\"w-full text-sm\"><thead class=\"bg-gray-50 border-b\"><tr>"; for (var j = 0; j < cols.length; j++) { html += "<th class=\"text-left px-4 py-3 text-xs font-medium text-gray-500 uppercase\">" + cols[j].label + "</th>"; } html += "<th class=\"text-right px-4 py-3 text-xs\">Actions</th></tr></thead><tbody class=\"divide-y divide-gray-100\">"; if (items.length === 0) { html += "<tr><td colspan=\"" + (cols.length + 1) + "\" class=\"px-4 py-8 text-center text-gray-400\">No records</td></tr>"; } for (var k = 0; k < items.length; k++) { var item = items[k]; html += "<tr class=\"hover:bg-gray-50\">"; for (var l = 0; l < cols.length; l++) { var col = cols[l]; var val = item[col.key]; var d = ""; if (val === null || val === undefined) { d = "<span class=\"text-gray-300 italic\">null</span>"; } else if (col.type === "boolean") { d = val ? "<span class=\"text-green-600\">Yes</span>" : "<span class=\"text-red-400\">No</span>"; } else if (col.type === "datetime") { d = "<span class=\"text-gray-600\">" + new Date(val).toLocaleString() + "</span>"; } else if (col.type === "uuid") { d = "<span class=\"font-mono text-xs text-gray-500\">" + String(val).slice(0, 8) + "...</span>"; } else if (col.type === "json" || col.type === "array") { d = "<span class=\"font-mono text-xs text-gray-500\">" + JSON.stringify(val).slice(0, 40) + "</span>"; } else { d = "<span class=\"text-gray-800\">" + String(val).slice(0, 60) + "</span>"; } html += "<td class=\"px-4 py-3\">" + d + "</td>"; } html += "<td class=\"px-4 py-3 text-right\"><button onclick=\"openEditModal('" + item.id + "')\" class=\"text-blue-600 hover:text-blue-800 text-xs mr-2\">Edit</button><button onclick=\"deleteRecord('" + item.id + "')\" class=\"text-red-500 hover:text-red-700 text-xs\">Delete</button></td></tr>"; } html += "</tbody></table></div></div>"; area.innerHTML = html; } catch(e) { area.innerHTML = "<p class=\"text-red-600\">Error: " + e.message + "</p>"; } finally { area.classList.remove("loading"); } }
|
|
474
|
-
function openCreateModal() { if (!currentEntity) return; editingId = null; document.getElementById("modal-title").textContent = "Create " + currentEntity.name; renderFormFields(null); document.getElementById("modal").classList.remove("hidden"); }
|
|
475
|
-
async function openEditModal(id) { if (!currentEntity) return; editingId = id; document.getElementById("modal-title").textContent = "Edit " + currentEntity.name; try { var res = await fetch(BASE_URL + currentEntity.apiPath + "/" + id, { headers: headers() }); var data = await res.json(); renderFormFields(data); document.getElementById("modal").classList.remove("hidden"); } catch(e) { toast("Failed to load: " + e.message, "error"); } }
|
|
476
|
-
function renderFormFields(data) { var fields = currentEntity.formFields; var html = ""; for (var i = 0; i < fields.length; i++) { var f = fields[i]; var val = data ? (data[f.key] !== undefined ? data[f.key] : "") : ""; var it = f.type === "boolean" ? "checkbox" : f.type === "datetime" ? "datetime-local" : f.type === "json" || f.type === "array" ? "textarea" : "text"; html += "<div><label class=\"block text-sm font-medium text-gray-700 mb-1\">" + f.label + (f.nullable ? "" : " *") + "</label>"; if (it === "checkbox") { html += "<input type=\"checkbox\" name=\"" + f.key + "\" " + (val ? "checked" : "") + " class=\"h-4 w-4 text-blue-600 rounded border-gray-300\" />"; } else if (it === "textarea") { html += "<textarea name=\"" + f.key + "\" rows=\"3\" class=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\">" + (typeof val === "object" ? JSON.stringify(val, null, 2) : val) + "</textarea>"; } else { html += "<input type=\"" + it + "\" name=\"" + f.key + "\" value=\"" + val + "\" class=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\" />"; } html += "</div>"; } document.getElementById("form-fields").innerHTML = html; }
|
|
477
|
-
async function submitForm(e) { e.preventDefault(); if (!currentEntity) return; var form = document.getElementById("modal-form"); var body = {}; for (var i = 0; i < currentEntity.formFields.length; i++) { var f = currentEntity.formFields[i]; var el = form.elements[f.key]; if (!el) continue; if (f.type === "boolean") { body[f.key] = el.checked; } else if (f.type === "json" || f.type === "array") { try { body[f.key] = JSON.parse(el.value); } catch(ex) { body[f.key] = el.value; } } else { body[f.key] = el.value; } } try { var url = editingId ? BASE_URL + currentEntity.apiPath + "/" + editingId : BASE_URL + currentEntity.apiPath; var method = editingId ? "PUT" : "POST"; var res = await fetch(url, { method: method, headers: headers(), body: JSON.stringify(body) }); var data = await res.json(); if (!res.ok) throw new Error(data.error && data.error.message || "Request failed"); toast(editingId ? "Updated" : "Created"); closeModal(); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
478
|
-
async function deleteRecord(id) { if (!confirm("Delete this record?")) return; try { var res = await fetch(BASE_URL + currentEntity.apiPath + "/" + id, { method: "DELETE", headers: headers() }); if (!res.ok) { var d = await res.json().catch(function() { return {}; }); throw new Error(d.error && d.error.message || "Delete failed"); } toast("Deleted"); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
479
|
-
function runCapability(endpoint, label) { pendingCapability = { endpoint: endpoint, label: label }; document.getElementById("cap-modal-title").textContent = label; document.getElementById("cap-modal-desc").textContent = "Run this capability?"; document.getElementById("cap-modal").classList.remove("hidden"); }
|
|
480
|
-
async function confirmCapability() { if (!pendingCapability) return; closeCapModal(); try { var res = await fetch(BASE_URL + pendingCapability.endpoint, { method: "POST", headers: headers(), body: JSON.stringify({}) }); var data = await res.json().catch(function() { return {}; }); if (!res.ok) throw new Error(data.error && data.error.message || "Failed"); toast(pendingCapability.label + " completed"); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
481
|
-
function closeModal() { document.getElementById("modal").classList.add("hidden"); editingId = null; }
|
|
482
|
-
function closeCapModal() { document.getElementById("cap-modal").classList.add("hidden"); pendingCapability = null; }
|
|
483
|
-
document.getElementById("modal").addEventListener("click", function(e) { if (e.target === e.currentTarget) closeModal(); });
|
|
484
|
-
document.getElementById("cap-modal").addEventListener("click", function(e) { if (e.target === e.currentTarget) closeCapModal(); });</script>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="bonescript-api-url" content="http://localhost:3000" />
|
|
7
|
+
<title>WorkspaceDomain Admin</title>
|
|
8
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
9
|
+
<style>.loading{opacity:.5;pointer-events:none}.toast{animation:fadeout 3s forwards}@keyframes fadeout{0%,70%{opacity:1}100%{opacity:0}}</style>
|
|
10
|
+
</head>
|
|
11
|
+
<body class="bg-gray-50 min-h-screen">
|
|
12
|
+
<div class="flex h-screen overflow-hidden">
|
|
13
|
+
<aside class="w-64 bg-gray-900 text-white flex flex-col">
|
|
14
|
+
<div class="p-4 border-b border-gray-700"><h1 class="text-lg font-bold">WorkspaceDomain</h1><p class="text-xs text-gray-400 mt-1">Admin Panel</p></div>
|
|
15
|
+
<nav class="flex-1 overflow-y-auto p-2" id="nav"><button onclick="loadEntity('workspaces')" id="nav-workspaces" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Workspace</button>
|
|
16
|
+
<button onclick="loadEntity('codebases')" id="nav-codebases" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Codebase</button>
|
|
17
|
+
<button onclick="loadEntity('snapshots')" id="nav-snapshots" class="w-full text-left px-3 py-2 rounded text-sm text-gray-300 hover:bg-gray-700 hover:text-white transition-colors mb-1">Snapshot</button></nav>
|
|
18
|
+
<div class="p-4 border-t border-gray-700"><div class="text-xs text-gray-500"><div id="auth-status">Not authenticated</div>
|
|
19
|
+
<input id="token-input" type="password" placeholder="Bearer token" class="mt-2 w-full bg-gray-800 text-white text-xs px-2 py-1 rounded border border-gray-600" onchange="setToken(this.value)" /></div></div>
|
|
20
|
+
</aside>
|
|
21
|
+
<main class="flex-1 overflow-y-auto">
|
|
22
|
+
<div class="bg-white border-b px-6 py-4 flex items-center justify-between sticky top-0 z-10">
|
|
23
|
+
<div><h2 class="text-xl font-semibold text-gray-800" id="page-title">Select an entity</h2><p class="text-sm text-gray-500" id="page-subtitle"></p></div>
|
|
24
|
+
<div class="flex gap-2">
|
|
25
|
+
<button onclick="openCreateModal()" id="create-btn" class="hidden bg-blue-600 text-white px-4 py-2 rounded text-sm hover:bg-blue-700">+ Create</button>
|
|
26
|
+
<button onclick="refreshTable()" id="refresh-btn" class="hidden bg-gray-100 text-gray-700 px-3 py-2 rounded text-sm hover:bg-gray-200">↻ Refresh</button>
|
|
27
|
+
</div></div>
|
|
28
|
+
<div id="toast-container" class="fixed top-4 right-4 z-50 flex flex-col gap-2"></div>
|
|
29
|
+
<div class="p-6" id="content-area"><div class="text-center text-gray-400 mt-20"><div class="text-5xl mb-4">⚡</div><p class="text-lg">Select an entity from the sidebar</p><p class="text-sm mt-2">Generated by BoneScript compiler</p></div></div>
|
|
30
|
+
</main></div>
|
|
31
|
+
<div id="modal" class="hidden fixed inset-0 bg-black bg-opacity-50 z-40 flex items-center justify-center p-4"><div class="bg-white rounded-lg shadow-xl w-full max-w-lg max-h-screen overflow-y-auto"><div class="p-6"><div class="flex items-center justify-between mb-4"><h3 class="text-lg font-semibold" id="modal-title">Create</h3><button onclick="closeModal()" class="text-gray-400 hover:text-gray-600 text-2xl">×</button></div><form id="modal-form" onsubmit="submitForm(event)" class="space-y-4"><div id="form-fields"></div><div class="flex gap-2 pt-2"><button type="submit" class="flex-1 bg-blue-600 text-white py-2 rounded hover:bg-blue-700">Save</button><button type="button" onclick="closeModal()" class="flex-1 bg-gray-100 text-gray-700 py-2 rounded hover:bg-gray-200">Cancel</button></div></form></div></div></div>
|
|
32
|
+
<div id="cap-modal" class="hidden fixed inset-0 bg-black bg-opacity-50 z-40 flex items-center justify-center p-4"><div class="bg-white rounded-lg shadow-xl w-full max-w-md"><div class="p-6"><div class="flex items-center justify-between mb-4"><h3 class="text-lg font-semibold" id="cap-modal-title">Run Capability</h3><button onclick="closeCapModal()" class="text-gray-400 hover:text-gray-600 text-2xl">×</button></div><p class="text-sm text-gray-500 mb-4" id="cap-modal-desc"></p><div class="flex gap-2"><button onclick="confirmCapability()" class="flex-1 bg-orange-500 text-white py-2 rounded hover:bg-orange-600">Run</button><button onclick="closeCapModal()" class="flex-1 bg-gray-100 text-gray-700 py-2 rounded hover:bg-gray-200">Cancel</button></div></div></div></div>
|
|
33
|
+
<script>const BASE_URL = (document.querySelector('meta[name="bonescript-api-url"]') || {}).content || "http://localhost:3000";
|
|
34
|
+
const ENTITIES = [
|
|
35
|
+
{
|
|
36
|
+
"name": "Workspace",
|
|
37
|
+
"tableName": "workspaces",
|
|
38
|
+
"apiPath": "/workspaces",
|
|
39
|
+
"columns": [
|
|
40
|
+
{
|
|
41
|
+
"key": "id",
|
|
42
|
+
"label": "Id",
|
|
43
|
+
"type": "uuid",
|
|
44
|
+
"nullable": false
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"key": "created_at",
|
|
48
|
+
"label": "Created At",
|
|
49
|
+
"type": "datetime",
|
|
50
|
+
"nullable": false
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"key": "updated_at",
|
|
54
|
+
"label": "Updated At",
|
|
55
|
+
"type": "datetime",
|
|
56
|
+
"nullable": false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"key": "project_id",
|
|
60
|
+
"label": "Project Id",
|
|
61
|
+
"type": "uuid",
|
|
62
|
+
"nullable": false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"key": "root_path",
|
|
66
|
+
"label": "Root Path",
|
|
67
|
+
"type": "text",
|
|
68
|
+
"nullable": false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"key": "git_remote",
|
|
72
|
+
"label": "Git Remote",
|
|
73
|
+
"type": "text",
|
|
74
|
+
"nullable": true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"key": "git_branch",
|
|
78
|
+
"label": "Git Branch",
|
|
79
|
+
"type": "text",
|
|
80
|
+
"nullable": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"key": "git_commit",
|
|
84
|
+
"label": "Git Commit",
|
|
85
|
+
"type": "text",
|
|
86
|
+
"nullable": true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"key": "is_dirty",
|
|
90
|
+
"label": "Is Dirty",
|
|
91
|
+
"type": "boolean",
|
|
92
|
+
"nullable": false
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"key": "file_count",
|
|
96
|
+
"label": "File Count",
|
|
97
|
+
"type": "text",
|
|
98
|
+
"nullable": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"key": "total_size_bytes",
|
|
102
|
+
"label": "Total Size Bytes",
|
|
103
|
+
"type": "text",
|
|
104
|
+
"nullable": true
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"key": "config",
|
|
108
|
+
"label": "Config",
|
|
109
|
+
"type": "text",
|
|
110
|
+
"nullable": true
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"formFields": [
|
|
114
|
+
{
|
|
115
|
+
"key": "project_id",
|
|
116
|
+
"label": "Project Id",
|
|
117
|
+
"type": "uuid",
|
|
118
|
+
"nullable": false
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"key": "root_path",
|
|
122
|
+
"label": "Root Path",
|
|
123
|
+
"type": "text",
|
|
124
|
+
"nullable": false
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"key": "git_remote",
|
|
128
|
+
"label": "Git Remote",
|
|
129
|
+
"type": "text",
|
|
130
|
+
"nullable": true
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"key": "git_branch",
|
|
134
|
+
"label": "Git Branch",
|
|
135
|
+
"type": "text",
|
|
136
|
+
"nullable": true
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"key": "git_commit",
|
|
140
|
+
"label": "Git Commit",
|
|
141
|
+
"type": "text",
|
|
142
|
+
"nullable": true
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"key": "is_dirty",
|
|
146
|
+
"label": "Is Dirty",
|
|
147
|
+
"type": "boolean",
|
|
148
|
+
"nullable": false
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"key": "file_count",
|
|
152
|
+
"label": "File Count",
|
|
153
|
+
"type": "text",
|
|
154
|
+
"nullable": true
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"key": "total_size_bytes",
|
|
158
|
+
"label": "Total Size Bytes",
|
|
159
|
+
"type": "text",
|
|
160
|
+
"nullable": true
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"key": "config",
|
|
164
|
+
"label": "Config",
|
|
165
|
+
"type": "text",
|
|
166
|
+
"nullable": true
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"capabilities": [
|
|
170
|
+
{
|
|
171
|
+
"name": "create_snapshot",
|
|
172
|
+
"label": "Create Snapshot",
|
|
173
|
+
"endpoint": "/workspaces/create-snapshot"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "revert_to_snapshot",
|
|
177
|
+
"label": "Revert To Snapshot",
|
|
178
|
+
"endpoint": "/workspaces/revert-to-snapshot"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "analyze_codebase",
|
|
182
|
+
"label": "Analyze Codebase",
|
|
183
|
+
"endpoint": "/workspaces/analyze-codebase"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "Codebase",
|
|
189
|
+
"tableName": "codebases",
|
|
190
|
+
"apiPath": "/codebases",
|
|
191
|
+
"columns": [
|
|
192
|
+
{
|
|
193
|
+
"key": "id",
|
|
194
|
+
"label": "Id",
|
|
195
|
+
"type": "uuid",
|
|
196
|
+
"nullable": false
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"key": "created_at",
|
|
200
|
+
"label": "Created At",
|
|
201
|
+
"type": "datetime",
|
|
202
|
+
"nullable": false
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"key": "updated_at",
|
|
206
|
+
"label": "Updated At",
|
|
207
|
+
"type": "datetime",
|
|
208
|
+
"nullable": false
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"key": "workspace_id",
|
|
212
|
+
"label": "Workspace Id",
|
|
213
|
+
"type": "uuid",
|
|
214
|
+
"nullable": false
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"key": "project_id",
|
|
218
|
+
"label": "Project Id",
|
|
219
|
+
"type": "uuid",
|
|
220
|
+
"nullable": false
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"key": "primary_language",
|
|
224
|
+
"label": "Primary Language",
|
|
225
|
+
"type": "text",
|
|
226
|
+
"nullable": true
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"key": "languages",
|
|
230
|
+
"label": "Languages",
|
|
231
|
+
"type": "text",
|
|
232
|
+
"nullable": true
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"key": "framework",
|
|
236
|
+
"label": "Framework",
|
|
237
|
+
"type": "text",
|
|
238
|
+
"nullable": true
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"key": "build_tool",
|
|
242
|
+
"label": "Build Tool",
|
|
243
|
+
"type": "text",
|
|
244
|
+
"nullable": true
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"key": "test_framework",
|
|
248
|
+
"label": "Test Framework",
|
|
249
|
+
"type": "text",
|
|
250
|
+
"nullable": true
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"key": "entry_points",
|
|
254
|
+
"label": "Entry Points",
|
|
255
|
+
"type": "text",
|
|
256
|
+
"nullable": true
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"key": "dependencies",
|
|
260
|
+
"label": "Dependencies",
|
|
261
|
+
"type": "text",
|
|
262
|
+
"nullable": true
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"key": "analysis_version",
|
|
266
|
+
"label": "Analysis Version",
|
|
267
|
+
"type": "text",
|
|
268
|
+
"nullable": true
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
"formFields": [
|
|
272
|
+
{
|
|
273
|
+
"key": "workspace_id",
|
|
274
|
+
"label": "Workspace Id",
|
|
275
|
+
"type": "uuid",
|
|
276
|
+
"nullable": false
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"key": "project_id",
|
|
280
|
+
"label": "Project Id",
|
|
281
|
+
"type": "uuid",
|
|
282
|
+
"nullable": false
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"key": "primary_language",
|
|
286
|
+
"label": "Primary Language",
|
|
287
|
+
"type": "text",
|
|
288
|
+
"nullable": true
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"key": "languages",
|
|
292
|
+
"label": "Languages",
|
|
293
|
+
"type": "text",
|
|
294
|
+
"nullable": true
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"key": "framework",
|
|
298
|
+
"label": "Framework",
|
|
299
|
+
"type": "text",
|
|
300
|
+
"nullable": true
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"key": "build_tool",
|
|
304
|
+
"label": "Build Tool",
|
|
305
|
+
"type": "text",
|
|
306
|
+
"nullable": true
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"key": "test_framework",
|
|
310
|
+
"label": "Test Framework",
|
|
311
|
+
"type": "text",
|
|
312
|
+
"nullable": true
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"key": "entry_points",
|
|
316
|
+
"label": "Entry Points",
|
|
317
|
+
"type": "text",
|
|
318
|
+
"nullable": true
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"key": "dependencies",
|
|
322
|
+
"label": "Dependencies",
|
|
323
|
+
"type": "text",
|
|
324
|
+
"nullable": true
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"key": "analysis_version",
|
|
328
|
+
"label": "Analysis Version",
|
|
329
|
+
"type": "text",
|
|
330
|
+
"nullable": true
|
|
331
|
+
}
|
|
332
|
+
],
|
|
333
|
+
"capabilities": []
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"name": "Snapshot",
|
|
337
|
+
"tableName": "snapshots",
|
|
338
|
+
"apiPath": "/snapshots",
|
|
339
|
+
"columns": [
|
|
340
|
+
{
|
|
341
|
+
"key": "id",
|
|
342
|
+
"label": "Id",
|
|
343
|
+
"type": "uuid",
|
|
344
|
+
"nullable": false
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"key": "created_at",
|
|
348
|
+
"label": "Created At",
|
|
349
|
+
"type": "datetime",
|
|
350
|
+
"nullable": false
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"key": "updated_at",
|
|
354
|
+
"label": "Updated At",
|
|
355
|
+
"type": "datetime",
|
|
356
|
+
"nullable": false
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"key": "session_id",
|
|
360
|
+
"label": "Session Id",
|
|
361
|
+
"type": "uuid",
|
|
362
|
+
"nullable": false
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"key": "project_id",
|
|
366
|
+
"label": "Project Id",
|
|
367
|
+
"type": "uuid",
|
|
368
|
+
"nullable": false
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"key": "workspace_id",
|
|
372
|
+
"label": "Workspace Id",
|
|
373
|
+
"type": "uuid",
|
|
374
|
+
"nullable": false
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"key": "git_hash",
|
|
378
|
+
"label": "Git Hash",
|
|
379
|
+
"type": "text",
|
|
380
|
+
"nullable": false
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"key": "message_id",
|
|
384
|
+
"label": "Message Id",
|
|
385
|
+
"type": "text",
|
|
386
|
+
"nullable": true
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"key": "part_id",
|
|
390
|
+
"label": "Part Id",
|
|
391
|
+
"type": "text",
|
|
392
|
+
"nullable": true
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"key": "diff_summary",
|
|
396
|
+
"label": "Diff Summary",
|
|
397
|
+
"type": "text",
|
|
398
|
+
"nullable": true
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"key": "files_changed",
|
|
402
|
+
"label": "Files Changed",
|
|
403
|
+
"type": "text",
|
|
404
|
+
"nullable": true
|
|
405
|
+
}
|
|
406
|
+
],
|
|
407
|
+
"formFields": [
|
|
408
|
+
{
|
|
409
|
+
"key": "session_id",
|
|
410
|
+
"label": "Session Id",
|
|
411
|
+
"type": "uuid",
|
|
412
|
+
"nullable": false
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"key": "project_id",
|
|
416
|
+
"label": "Project Id",
|
|
417
|
+
"type": "uuid",
|
|
418
|
+
"nullable": false
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
"key": "workspace_id",
|
|
422
|
+
"label": "Workspace Id",
|
|
423
|
+
"type": "uuid",
|
|
424
|
+
"nullable": false
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"key": "git_hash",
|
|
428
|
+
"label": "Git Hash",
|
|
429
|
+
"type": "text",
|
|
430
|
+
"nullable": false
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"key": "message_id",
|
|
434
|
+
"label": "Message Id",
|
|
435
|
+
"type": "text",
|
|
436
|
+
"nullable": true
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"key": "part_id",
|
|
440
|
+
"label": "Part Id",
|
|
441
|
+
"type": "text",
|
|
442
|
+
"nullable": true
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"key": "diff_summary",
|
|
446
|
+
"label": "Diff Summary",
|
|
447
|
+
"type": "text",
|
|
448
|
+
"nullable": true
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"key": "files_changed",
|
|
452
|
+
"label": "Files Changed",
|
|
453
|
+
"type": "text",
|
|
454
|
+
"nullable": true
|
|
455
|
+
}
|
|
456
|
+
],
|
|
457
|
+
"capabilities": [
|
|
458
|
+
{
|
|
459
|
+
"name": "revert_to_snapshot",
|
|
460
|
+
"label": "Revert To Snapshot",
|
|
461
|
+
"endpoint": "/snapshots/revert-to-snapshot"
|
|
462
|
+
}
|
|
463
|
+
]
|
|
464
|
+
}
|
|
465
|
+
];
|
|
466
|
+
let currentEntity = null, currentPage = 1, editingId = null, pendingCapability = null;
|
|
467
|
+
let authToken = localStorage.getItem("admin_token") || "";
|
|
468
|
+
if (authToken) { document.getElementById("token-input").value = authToken; document.getElementById("auth-status").textContent = "Token set"; }
|
|
469
|
+
function setToken(v) { authToken = v; localStorage.setItem("admin_token", v); document.getElementById("auth-status").textContent = v ? "Token set" : "Not authenticated"; }
|
|
470
|
+
function headers() { const h = { "Content-Type": "application/json" }; if (authToken) h["Authorization"] = "Bearer " + authToken; return h; }
|
|
471
|
+
function toast(msg, type) { const el = document.createElement("div"); el.className = "toast px-4 py-2 rounded shadow text-sm text-white " + (type === "error" ? "bg-red-500" : "bg-green-500"); el.textContent = msg; document.getElementById("toast-container").appendChild(el); setTimeout(function() { el.remove(); }, 3500); }
|
|
472
|
+
function loadEntity(t) { currentEntity = ENTITIES.find(function(e) { return e.tableName === t; }); if (!currentEntity) return; currentPage = 1; document.querySelectorAll("[id^=nav-]").forEach(function(el) { el.classList.remove("bg-gray-700", "text-white"); el.classList.add("text-gray-300"); }); var n = document.getElementById("nav-" + t); if (n) { n.classList.add("bg-gray-700", "text-white"); n.classList.remove("text-gray-300"); } document.getElementById("page-title").textContent = currentEntity.name; document.getElementById("page-subtitle").textContent = currentEntity.apiPath; document.getElementById("create-btn").classList.remove("hidden"); document.getElementById("refresh-btn").classList.remove("hidden"); refreshTable(); }
|
|
473
|
+
async function refreshTable() { if (!currentEntity) return; var area = document.getElementById("content-area"); area.classList.add("loading"); try { var res = await fetch(BASE_URL + currentEntity.apiPath + "?page=" + currentPage + "&page_size=50", { headers: headers() }); var data = await res.json(); if (!res.ok) { area.innerHTML = "<p class=\"text-red-600\">" + (data.error && data.error.message || "Error") + "</p>"; return; } var items = data.items || []; var total = data.total || 0; var cols = currentEntity.columns; var caps = currentEntity.capabilities; var html = "<div class=\"bg-white rounded-lg shadow overflow-hidden\"><div class=\"px-4 py-3 border-b flex items-center justify-between\"><span class=\"text-sm text-gray-500\">" + total + " total</span>"; if (caps.length > 0) { html += "<div class=\"flex gap-2\">"; for (var i = 0; i < caps.length; i++) { html += "<button onclick=\"runCapability('" + caps[i].endpoint + "','" + caps[i].label + "')\" class=\"text-xs bg-orange-100 text-orange-700 px-2 py-1 rounded\">" + caps[i].label + "</button>"; } html += "</div>"; } html += "</div><div class=\"overflow-x-auto\"><table class=\"w-full text-sm\"><thead class=\"bg-gray-50 border-b\"><tr>"; for (var j = 0; j < cols.length; j++) { html += "<th class=\"text-left px-4 py-3 text-xs font-medium text-gray-500 uppercase\">" + cols[j].label + "</th>"; } html += "<th class=\"text-right px-4 py-3 text-xs\">Actions</th></tr></thead><tbody class=\"divide-y divide-gray-100\">"; if (items.length === 0) { html += "<tr><td colspan=\"" + (cols.length + 1) + "\" class=\"px-4 py-8 text-center text-gray-400\">No records</td></tr>"; } for (var k = 0; k < items.length; k++) { var item = items[k]; html += "<tr class=\"hover:bg-gray-50\">"; for (var l = 0; l < cols.length; l++) { var col = cols[l]; var val = item[col.key]; var d = ""; if (val === null || val === undefined) { d = "<span class=\"text-gray-300 italic\">null</span>"; } else if (col.type === "boolean") { d = val ? "<span class=\"text-green-600\">Yes</span>" : "<span class=\"text-red-400\">No</span>"; } else if (col.type === "datetime") { d = "<span class=\"text-gray-600\">" + new Date(val).toLocaleString() + "</span>"; } else if (col.type === "uuid") { d = "<span class=\"font-mono text-xs text-gray-500\">" + String(val).slice(0, 8) + "...</span>"; } else if (col.type === "json" || col.type === "array") { d = "<span class=\"font-mono text-xs text-gray-500\">" + JSON.stringify(val).slice(0, 40) + "</span>"; } else { d = "<span class=\"text-gray-800\">" + String(val).slice(0, 60) + "</span>"; } html += "<td class=\"px-4 py-3\">" + d + "</td>"; } html += "<td class=\"px-4 py-3 text-right\"><button onclick=\"openEditModal('" + item.id + "')\" class=\"text-blue-600 hover:text-blue-800 text-xs mr-2\">Edit</button><button onclick=\"deleteRecord('" + item.id + "')\" class=\"text-red-500 hover:text-red-700 text-xs\">Delete</button></td></tr>"; } html += "</tbody></table></div></div>"; area.innerHTML = html; } catch(e) { area.innerHTML = "<p class=\"text-red-600\">Error: " + e.message + "</p>"; } finally { area.classList.remove("loading"); } }
|
|
474
|
+
function openCreateModal() { if (!currentEntity) return; editingId = null; document.getElementById("modal-title").textContent = "Create " + currentEntity.name; renderFormFields(null); document.getElementById("modal").classList.remove("hidden"); }
|
|
475
|
+
async function openEditModal(id) { if (!currentEntity) return; editingId = id; document.getElementById("modal-title").textContent = "Edit " + currentEntity.name; try { var res = await fetch(BASE_URL + currentEntity.apiPath + "/" + id, { headers: headers() }); var data = await res.json(); renderFormFields(data); document.getElementById("modal").classList.remove("hidden"); } catch(e) { toast("Failed to load: " + e.message, "error"); } }
|
|
476
|
+
function renderFormFields(data) { var fields = currentEntity.formFields; var html = ""; for (var i = 0; i < fields.length; i++) { var f = fields[i]; var val = data ? (data[f.key] !== undefined ? data[f.key] : "") : ""; var it = f.type === "boolean" ? "checkbox" : f.type === "datetime" ? "datetime-local" : f.type === "json" || f.type === "array" ? "textarea" : "text"; html += "<div><label class=\"block text-sm font-medium text-gray-700 mb-1\">" + f.label + (f.nullable ? "" : " *") + "</label>"; if (it === "checkbox") { html += "<input type=\"checkbox\" name=\"" + f.key + "\" " + (val ? "checked" : "") + " class=\"h-4 w-4 text-blue-600 rounded border-gray-300\" />"; } else if (it === "textarea") { html += "<textarea name=\"" + f.key + "\" rows=\"3\" class=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\">" + (typeof val === "object" ? JSON.stringify(val, null, 2) : val) + "</textarea>"; } else { html += "<input type=\"" + it + "\" name=\"" + f.key + "\" value=\"" + val + "\" class=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\" />"; } html += "</div>"; } document.getElementById("form-fields").innerHTML = html; }
|
|
477
|
+
async function submitForm(e) { e.preventDefault(); if (!currentEntity) return; var form = document.getElementById("modal-form"); var body = {}; for (var i = 0; i < currentEntity.formFields.length; i++) { var f = currentEntity.formFields[i]; var el = form.elements[f.key]; if (!el) continue; if (f.type === "boolean") { body[f.key] = el.checked; } else if (f.type === "json" || f.type === "array") { try { body[f.key] = JSON.parse(el.value); } catch(ex) { body[f.key] = el.value; } } else { body[f.key] = el.value; } } try { var url = editingId ? BASE_URL + currentEntity.apiPath + "/" + editingId : BASE_URL + currentEntity.apiPath; var method = editingId ? "PUT" : "POST"; var res = await fetch(url, { method: method, headers: headers(), body: JSON.stringify(body) }); var data = await res.json(); if (!res.ok) throw new Error(data.error && data.error.message || "Request failed"); toast(editingId ? "Updated" : "Created"); closeModal(); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
478
|
+
async function deleteRecord(id) { if (!confirm("Delete this record?")) return; try { var res = await fetch(BASE_URL + currentEntity.apiPath + "/" + id, { method: "DELETE", headers: headers() }); if (!res.ok) { var d = await res.json().catch(function() { return {}; }); throw new Error(d.error && d.error.message || "Delete failed"); } toast("Deleted"); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
479
|
+
function runCapability(endpoint, label) { pendingCapability = { endpoint: endpoint, label: label }; document.getElementById("cap-modal-title").textContent = label; document.getElementById("cap-modal-desc").textContent = "Run this capability?"; document.getElementById("cap-modal").classList.remove("hidden"); }
|
|
480
|
+
async function confirmCapability() { if (!pendingCapability) return; closeCapModal(); try { var res = await fetch(BASE_URL + pendingCapability.endpoint, { method: "POST", headers: headers(), body: JSON.stringify({}) }); var data = await res.json().catch(function() { return {}; }); if (!res.ok) throw new Error(data.error && data.error.message || "Failed"); toast(pendingCapability.label + " completed"); refreshTable(); } catch(e) { toast(e.message, "error"); } }
|
|
481
|
+
function closeModal() { document.getElementById("modal").classList.add("hidden"); editingId = null; }
|
|
482
|
+
function closeCapModal() { document.getElementById("cap-modal").classList.add("hidden"); pendingCapability = null; }
|
|
483
|
+
document.getElementById("modal").addEventListener("click", function(e) { if (e.target === e.currentTarget) closeModal(); });
|
|
484
|
+
document.getElementById("cap-modal").addEventListener("click", function(e) { if (e.target === e.currentTarget) closeCapModal(); });</script>
|
|
485
485
|
</body></html>
|