@pellux/goodvibes-agent 1.4.3 → 1.5.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/CHANGELOG.md +24 -0
- package/README.md +7 -7
- package/dist/package/main.js +7450 -12285
- package/docs/README.md +2 -2
- package/docs/channels-remote-and-api.md +1 -1
- package/docs/getting-started.md +2 -2
- package/docs/release-and-publishing.md +1 -1
- package/docs/tools-and-commands.md +5 -5
- package/package.json +4 -2
- package/release/performance-snapshot.json +2 -2
- package/release/release-notes.md +11 -7
- package/release/release-readiness.json +6 -6
- package/src/agent/behavior-discovery-summary.ts +4 -18
- package/src/agent/calendar-registry.ts +322 -0
- package/src/agent/competitive-feature-inventory.ts +268 -130
- package/src/agent/document-registry.ts +5 -1
- package/src/agent/email/email-service.ts +350 -0
- package/src/agent/email/imap-client.ts +596 -0
- package/src/agent/email/smtp-client.ts +453 -0
- package/src/agent/ics-calendar.ts +662 -0
- package/src/agent/ics-timezone.ts +172 -0
- package/src/agent/markdown-frontmatter.ts +31 -0
- package/src/agent/memory-safety.ts +1 -1
- package/src/agent/note-registry.ts +3 -9
- package/src/agent/persona-discovery.ts +3 -15
- package/src/agent/persona-registry.ts +1 -10
- package/src/agent/research-source-registry.ts +5 -1
- package/src/agent/routine-discovery.ts +3 -15
- package/src/agent/runtime-profile.ts +3 -0
- package/src/agent/skill-discovery.ts +3 -15
- package/src/agent/skill-draft-proposer.ts +203 -0
- package/src/agent/skill-draft-runner.ts +201 -0
- package/src/agent/skill-registry.ts +36 -1
- package/src/agent/skill-standard.ts +99 -0
- package/src/agent/vibe-file.ts +7 -22
- package/src/cli/completion.ts +1 -1
- package/src/cli/config-overrides.ts +10 -1
- package/src/cli/redaction.ts +17 -5
- package/src/config/provider-model.ts +2 -1
- package/src/config/secret-config.ts +13 -6
- package/src/core/activity-feed.ts +97 -0
- package/src/core/away-digest.ts +161 -0
- package/src/core/conversation-rendering.ts +7 -3
- package/src/core/conversation.ts +22 -15
- package/src/core/hardware-profile.ts +362 -0
- package/src/core/last-seen-store.ts +78 -0
- package/src/core/plain-language.ts +52 -0
- package/src/core/setup-incomplete-hint.ts +90 -0
- package/src/core/system-message-router.ts +38 -87
- package/src/input/agent-workspace-basic-command-editor-submission.ts +60 -220
- package/src/input/agent-workspace-basic-command-editors.ts +39 -141
- package/src/input/agent-workspace-categories.ts +63 -158
- package/src/input/agent-workspace-command-editor.ts +4 -0
- package/src/input/agent-workspace-host-category.ts +0 -5
- package/src/input/agent-workspace-local-editor-submission.ts +3 -1
- package/src/input/agent-workspace-navigation.ts +10 -3
- package/src/input/agent-workspace-onboarding-actions.ts +132 -0
- package/src/input/agent-workspace-onboarding-categories.ts +29 -26
- package/src/input/agent-workspace-onboarding-finish.ts +11 -4
- package/src/input/agent-workspace-onboarding-state.ts +111 -0
- package/src/input/agent-workspace-profile-editor-submission.ts +260 -0
- package/src/input/agent-workspace-profile-editors.ts +155 -0
- package/src/input/agent-workspace-subscription-editor.ts +7 -0
- package/src/input/agent-workspace-types.ts +5 -1
- package/src/input/agent-workspace.ts +65 -39
- package/src/input/command-registry.ts +18 -5
- package/src/input/commands/agent-runtime-profile-runtime.ts +2 -1
- package/src/input/commands/agent-skills-runtime.ts +60 -3
- package/src/input/commands/calendar-runtime.ts +209 -0
- package/src/input/commands/channels-runtime.ts +1 -0
- package/src/input/commands/command-error.ts +9 -0
- package/src/input/commands/compat-runtime.ts +1 -0
- package/src/input/commands/config.ts +1 -0
- package/src/input/commands/conversation-runtime.ts +1 -1
- package/src/input/commands/delegation-runtime.ts +5 -6
- package/src/input/commands/email-runtime.ts +387 -0
- package/src/input/commands/experience-runtime.ts +17 -4
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +6 -1
- package/src/input/commands/knowledge-format.ts +73 -0
- package/src/input/commands/knowledge.ts +9 -74
- package/src/input/commands/local-provider-runtime.ts +2 -1
- package/src/input/commands/local-runtime.ts +10 -4
- package/src/input/commands/mcp-runtime.ts +7 -0
- package/src/input/commands/notify-runtime.ts +17 -1
- package/src/input/commands/onboarding-runtime.ts +1 -0
- package/src/input/commands/operator-actions-runtime.ts +1 -0
- package/src/input/commands/operator-runtime.ts +3 -0
- package/src/input/commands/personas-runtime.ts +1 -0
- package/src/input/commands/platform-access-runtime.ts +40 -17
- package/src/input/commands/product-runtime.ts +6 -1
- package/src/input/commands/provider-accounts-runtime.ts +3 -2
- package/src/input/commands/qrcode-runtime.ts +1 -0
- package/src/input/commands/routines-runtime.ts +1 -0
- package/src/input/commands/runtime-services.ts +0 -13
- package/src/input/commands/security-runtime.ts +1 -0
- package/src/input/commands/session-content.ts +1 -0
- package/src/input/commands/shell-core.ts +5 -2
- package/src/input/commands/subscription-runtime.ts +33 -9
- package/src/input/commands/support-bundle-runtime.ts +8 -1
- package/src/input/commands/tasks-runtime.ts +1 -0
- package/src/input/commands/tts-runtime.ts +1 -0
- package/src/input/commands/vibe-runtime.ts +1 -0
- package/src/input/commands.ts +4 -0
- package/src/input/feed-context-factory.ts +3 -12
- package/src/input/handler-command-route.ts +7 -60
- package/src/input/handler-feed-routes.ts +0 -194
- package/src/input/handler-feed.ts +2 -54
- package/src/input/handler-interactions.ts +0 -2
- package/src/input/handler-modal-stack.ts +0 -9
- package/src/input/handler-picker-routes.ts +24 -1
- package/src/input/handler-shortcuts.ts +11 -40
- package/src/input/handler-ui-state.ts +13 -0
- package/src/input/handler.ts +8 -35
- package/src/input/keybindings.ts +40 -17
- package/src/input/model-picker-local-fit.ts +130 -0
- package/src/input/submission-router.ts +0 -5
- package/src/main.ts +111 -89
- package/src/renderer/activity-sidebar.ts +186 -0
- package/src/renderer/agent-workspace-context-lines.ts +5 -48
- package/src/renderer/agent-workspace-style.ts +1 -1
- package/src/renderer/agent-workspace.ts +14 -2
- package/src/renderer/compositor.ts +37 -125
- package/src/renderer/conversation-overlays.ts +3 -3
- package/src/renderer/help-overlay.ts +7 -5
- package/src/renderer/model-workspace.ts +101 -86
- package/src/{panels → renderer}/polish.ts +3 -3
- package/src/renderer/shell-surface.ts +4 -5
- package/src/renderer/status-token.ts +31 -11
- package/src/renderer/tab-strip.ts +1 -1
- package/src/renderer/tool-call.ts +7 -8
- package/src/renderer/tool-labels.ts +92 -0
- package/src/renderer/ui-factory.ts +48 -96
- package/src/runtime/bootstrap-command-context.ts +0 -5
- package/src/runtime/bootstrap-command-parts.ts +6 -15
- package/src/runtime/bootstrap-core.ts +34 -13
- package/src/runtime/bootstrap-hook-bridge.ts +3 -1
- package/src/runtime/bootstrap-shell.ts +3 -50
- package/src/runtime/bootstrap.ts +3 -4
- package/src/runtime/context.ts +1 -1
- package/src/runtime/diagnostics/panels/index.ts +0 -1
- package/src/runtime/diagnostics/panels/policy.ts +1 -1
- package/src/runtime/execution-ledger.ts +16 -1
- package/src/runtime/index.ts +6 -1
- package/src/runtime/onboarding/index.ts +1 -0
- package/src/runtime/onboarding/onboarding-state.ts +200 -0
- package/src/{panels → runtime}/provider-account-snapshot.ts +5 -2
- package/src/runtime/services.ts +16 -4
- package/src/runtime/terminal-output-guard.ts +7 -0
- package/src/runtime/tool-permission-safety.ts +1 -1
- package/src/runtime/ui/model-picker/data-provider.ts +1 -1
- package/src/runtime/ui/model-picker/health-enrichment.ts +2 -2
- package/src/runtime/ui/model-picker/types.ts +2 -2
- package/src/runtime/ui/provider-health/data-provider.ts +3 -3
- package/src/runtime/ui/provider-health/types.ts +2 -2
- package/src/runtime/ui-services.ts +0 -2
- package/src/shell/agent-workspace-fullscreen.ts +0 -1
- package/src/shell/autonomy-surfacing.ts +272 -0
- package/src/shell/session-continuity-hints.ts +0 -6
- package/src/shell/startup-wiring.ts +221 -0
- package/src/shell/ui-openers.ts +18 -29
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-harness-background-processes.ts +4 -4
- package/src/tools/agent-harness-browser-cockpit-route.ts +3 -3
- package/src/tools/agent-harness-command-runner.ts +6 -1
- package/src/tools/agent-harness-document-ops.ts +26 -53
- package/src/tools/agent-harness-execution-history.ts +1 -13
- package/src/tools/agent-harness-execution-posture.ts +0 -15
- package/src/tools/agent-harness-keybinding-metadata.ts +28 -29
- package/src/tools/agent-harness-local-model-cookbook.ts +24 -1
- package/src/tools/agent-harness-metadata.ts +16 -0
- package/src/tools/agent-harness-mode-catalog.ts +2 -9
- package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
- package/src/tools/agent-harness-setup-posture-utils.ts +1 -1
- package/src/tools/agent-harness-tool-schema.ts +13 -14
- package/src/tools/agent-harness-tool.ts +27 -23
- package/src/tools/agent-harness-ui-surface-metadata.ts +10 -20
- package/src/tools/agent-harness-workspace-action-runner.ts +3 -4
- package/src/tools/agent-workspace-tool.ts +2 -33
- package/src/utils/terminal-width.ts +9 -3
- package/src/version.ts +1 -1
- package/src/input/agent-workspace-panel-route.ts +0 -44
- package/src/input/panel-integration-actions.ts +0 -26
- package/src/panels/approval-panel.ts +0 -149
- package/src/panels/automation-control-panel.ts +0 -212
- package/src/panels/base-panel.ts +0 -254
- package/src/panels/builtin/agent.ts +0 -58
- package/src/panels/builtin/knowledge.ts +0 -26
- package/src/panels/builtin/operations.ts +0 -121
- package/src/panels/builtin/session.ts +0 -138
- package/src/panels/builtin/shared.ts +0 -275
- package/src/panels/builtin/usage.ts +0 -21
- package/src/panels/builtin-panels.ts +0 -23
- package/src/panels/confirm-state.ts +0 -61
- package/src/panels/context-visualizer-panel.ts +0 -204
- package/src/panels/cost-tracker-panel.ts +0 -444
- package/src/panels/docs-panel.ts +0 -285
- package/src/panels/index.ts +0 -25
- package/src/panels/knowledge-panel.ts +0 -417
- package/src/panels/memory-panel.ts +0 -226
- package/src/panels/panel-list-panel.ts +0 -464
- package/src/panels/panel-manager.ts +0 -570
- package/src/panels/provider-accounts-panel.ts +0 -233
- package/src/panels/provider-health-domains.ts +0 -208
- package/src/panels/provider-health-panel.ts +0 -720
- package/src/panels/provider-health-tracker.ts +0 -115
- package/src/panels/provider-stats-panel.ts +0 -366
- package/src/panels/qr-panel.ts +0 -207
- package/src/panels/schedule-panel.ts +0 -321
- package/src/panels/scrollable-list-panel.ts +0 -491
- package/src/panels/search-focus.ts +0 -32
- package/src/panels/security-panel.ts +0 -295
- package/src/panels/session-browser-panel.ts +0 -395
- package/src/panels/session-maintenance.ts +0 -125
- package/src/panels/subscription-panel.ts +0 -263
- package/src/panels/system-messages-panel.ts +0 -230
- package/src/panels/tasks-panel.ts +0 -344
- package/src/panels/thinking-panel.ts +0 -304
- package/src/panels/token-budget-panel.ts +0 -475
- package/src/panels/tool-inspector-panel.ts +0 -436
- package/src/panels/types.ts +0 -54
- package/src/renderer/panel-composite.ts +0 -158
- package/src/renderer/panel-tab-bar.ts +0 -69
- package/src/renderer/panel-workspace-bar.ts +0 -42
- package/src/runtime/diagnostics/panels/panel-resources.ts +0 -118
- package/src/tools/agent-harness-panel-metadata.ts +0 -211
- /package/src/runtime/perf/{panel-health-monitor.ts → component-health.ts} +0 -0
|
@@ -15,6 +15,7 @@ import { buildAgentWorkspaceSessionCommandEditorSubmission, isAgentWorkspaceSess
|
|
|
15
15
|
import { buildAgentWorkspaceSkillBundleCommandEditorSubmission, isAgentWorkspaceSkillBundleCommandSubmissionKind } from './agent-workspace-skill-bundle-command-editor-submission.ts';
|
|
16
16
|
import { buildAgentWorkspaceTaskCommandEditorSubmission, isAgentWorkspaceTaskCommandSubmissionKind } from './agent-workspace-task-command-editor-submission.ts';
|
|
17
17
|
import { buildAgentWorkspaceWorkPlanEditorSubmission, isAgentWorkspaceWorkPlanEditorKind } from './agent-workspace-workplan-editor-submission.ts';
|
|
18
|
+
import { buildAgentWorkspaceProfileEditorSubmission, isAgentWorkspaceProfileEditorSubmissionKind } from './agent-workspace-profile-editor-submission.ts';
|
|
18
19
|
import { quoteSlashCommandArg } from './slash-command-parser.ts';
|
|
19
20
|
|
|
20
21
|
type AgentWorkspaceFieldReader = (fieldId: string) => string;
|
|
@@ -306,226 +307,8 @@ export function buildAgentWorkspaceBasicCommandEditorSubmission(
|
|
|
306
307
|
},
|
|
307
308
|
};
|
|
308
309
|
}
|
|
309
|
-
if (editor.kind
|
|
310
|
-
|
|
311
|
-
return {
|
|
312
|
-
kind: 'editor',
|
|
313
|
-
editor: { ...editor, message: 'Starter template export not confirmed. Type yes, then press Enter.' },
|
|
314
|
-
status: 'Agent starter template export not confirmed.',
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
const command = `/agent-profile template export ${quoteSlashCommandArg(readField('templateId'))} ${quoteSlashCommandArg(readField('path'))} --yes`;
|
|
318
|
-
return {
|
|
319
|
-
kind: 'dispatch',
|
|
320
|
-
command,
|
|
321
|
-
status: 'Opening Agent starter template export.',
|
|
322
|
-
actionResult: {
|
|
323
|
-
kind: 'dispatched',
|
|
324
|
-
title: 'Opening Agent starter template export',
|
|
325
|
-
detail: 'The workspace handed a confirmed starter template export command to the shell-owned command router.',
|
|
326
|
-
command,
|
|
327
|
-
safety: 'safe',
|
|
328
|
-
},
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
if (editor.kind === 'profile-template-import') {
|
|
332
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
333
|
-
return {
|
|
334
|
-
kind: 'editor',
|
|
335
|
-
editor: { ...editor, message: 'Starter template import not confirmed. Type yes, then press Enter.' },
|
|
336
|
-
status: 'Agent starter template import not confirmed.',
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
const command = `/agent-profile template import ${quoteSlashCommandArg(readField('path'))} --yes`;
|
|
340
|
-
return {
|
|
341
|
-
kind: 'dispatch',
|
|
342
|
-
command,
|
|
343
|
-
status: 'Opening Agent starter template import.',
|
|
344
|
-
actionResult: {
|
|
345
|
-
kind: 'dispatched',
|
|
346
|
-
title: 'Opening Agent starter template import',
|
|
347
|
-
detail: 'The workspace handed a confirmed starter template import command to the shell-owned command router.',
|
|
348
|
-
command,
|
|
349
|
-
safety: 'safe',
|
|
350
|
-
},
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
if (editor.kind === 'profile-template-show') {
|
|
354
|
-
const command = `/agent-profile template show ${quoteSlashCommandArg(readField('id'))}`;
|
|
355
|
-
return {
|
|
356
|
-
kind: 'dispatch',
|
|
357
|
-
command,
|
|
358
|
-
status: 'Opening Agent starter template preview.',
|
|
359
|
-
actionResult: {
|
|
360
|
-
kind: 'dispatched',
|
|
361
|
-
title: 'Opening Agent starter template preview',
|
|
362
|
-
detail: 'The workspace handed a read-only starter template preview command to the shell-owned command router.',
|
|
363
|
-
command,
|
|
364
|
-
safety: 'read-only',
|
|
365
|
-
},
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
if (editor.kind === 'profile-show') {
|
|
369
|
-
const command = `/agent-profile show ${quoteSlashCommandArg(readField('profile'))}`;
|
|
370
|
-
return {
|
|
371
|
-
kind: 'dispatch',
|
|
372
|
-
command,
|
|
373
|
-
status: 'Opening Agent profile detail.',
|
|
374
|
-
actionResult: {
|
|
375
|
-
kind: 'dispatched',
|
|
376
|
-
title: 'Opening Agent profile detail',
|
|
377
|
-
detail: 'The workspace handed a read-only Agent profile inspection command to the shell-owned command router.',
|
|
378
|
-
command,
|
|
379
|
-
safety: 'read-only',
|
|
380
|
-
},
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
if (editor.kind === 'profile-template-from-discovered') {
|
|
384
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
385
|
-
return {
|
|
386
|
-
kind: 'editor',
|
|
387
|
-
editor: { ...editor, message: 'Starter-from-discovered creation not confirmed. Type yes, then press Enter.' },
|
|
388
|
-
status: 'Agent starter-from-discovered creation not confirmed.',
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
const parts = [
|
|
392
|
-
'/agent-profile',
|
|
393
|
-
'template',
|
|
394
|
-
'from-discovered',
|
|
395
|
-
quoteSlashCommandArg(readField('id')),
|
|
396
|
-
];
|
|
397
|
-
const name = readField('name');
|
|
398
|
-
const description = readField('description');
|
|
399
|
-
const persona = readField('persona');
|
|
400
|
-
const skills = readField('skills');
|
|
401
|
-
const routines = readField('routines');
|
|
402
|
-
if (name.length > 0) parts.push('--name', quoteSlashCommandArg(name));
|
|
403
|
-
if (description.length > 0) parts.push('--description', quoteSlashCommandArg(description));
|
|
404
|
-
if (persona.length > 0) parts.push('--persona', quoteSlashCommandArg(persona));
|
|
405
|
-
if (skills.length > 0) parts.push('--skills', quoteSlashCommandArg(skills));
|
|
406
|
-
if (routines.length > 0) parts.push('--routines', quoteSlashCommandArg(routines));
|
|
407
|
-
if (isAffirmative(readField('replace'))) parts.push('--replace');
|
|
408
|
-
parts.push('--yes');
|
|
409
|
-
const command = parts.join(' ');
|
|
410
|
-
return {
|
|
411
|
-
kind: 'dispatch',
|
|
412
|
-
command,
|
|
413
|
-
status: 'Opening Agent starter-from-discovered creation.',
|
|
414
|
-
actionResult: {
|
|
415
|
-
kind: 'dispatched',
|
|
416
|
-
title: 'Opening Agent starter-from-discovered creation',
|
|
417
|
-
detail: 'The workspace handed a confirmed starter creation command to the shell-owned command router.',
|
|
418
|
-
command,
|
|
419
|
-
safety: 'safe',
|
|
420
|
-
},
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
if (editor.kind === 'profile-from-discovered') {
|
|
424
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
425
|
-
return {
|
|
426
|
-
kind: 'editor',
|
|
427
|
-
editor: { ...editor, message: 'Profile-from-discovered creation not confirmed. Type yes, then press Enter.' },
|
|
428
|
-
status: 'Agent profile-from-discovered creation not confirmed.',
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
const parts = [
|
|
432
|
-
'/agent-profile',
|
|
433
|
-
'create-from-discovered',
|
|
434
|
-
quoteSlashCommandArg(readField('profile')),
|
|
435
|
-
];
|
|
436
|
-
const templateId = readField('templateId');
|
|
437
|
-
const name = readField('name');
|
|
438
|
-
const description = readField('description');
|
|
439
|
-
const persona = readField('persona');
|
|
440
|
-
const skills = readField('skills');
|
|
441
|
-
const routines = readField('routines');
|
|
442
|
-
if (templateId.length > 0) parts.push('--template-id', quoteSlashCommandArg(templateId));
|
|
443
|
-
if (name.length > 0) parts.push('--name', quoteSlashCommandArg(name));
|
|
444
|
-
if (description.length > 0) parts.push('--description', quoteSlashCommandArg(description));
|
|
445
|
-
if (persona.length > 0) parts.push('--persona', quoteSlashCommandArg(persona));
|
|
446
|
-
if (skills.length > 0) parts.push('--skills', quoteSlashCommandArg(skills));
|
|
447
|
-
if (routines.length > 0) parts.push('--routines', quoteSlashCommandArg(routines));
|
|
448
|
-
if (isAffirmative(readField('replace'))) parts.push('--replace');
|
|
449
|
-
parts.push('--yes');
|
|
450
|
-
const command = parts.join(' ');
|
|
451
|
-
return {
|
|
452
|
-
kind: 'dispatch',
|
|
453
|
-
command,
|
|
454
|
-
status: 'Opening Agent profile-from-discovered creation.',
|
|
455
|
-
actionResult: {
|
|
456
|
-
kind: 'dispatched',
|
|
457
|
-
title: 'Opening Agent profile-from-discovered creation',
|
|
458
|
-
detail: 'The workspace handed a confirmed discovered-behavior profile creation command to the shell-owned command router.',
|
|
459
|
-
command,
|
|
460
|
-
safety: 'safe',
|
|
461
|
-
},
|
|
462
|
-
};
|
|
463
|
-
}
|
|
464
|
-
if (editor.kind === 'profile-default') {
|
|
465
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
466
|
-
return {
|
|
467
|
-
kind: 'editor',
|
|
468
|
-
editor: { ...editor, message: 'Default Agent profile selection not confirmed. Type yes, then press Enter.' },
|
|
469
|
-
status: 'Default Agent profile selection not confirmed.',
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
const command = `/agent-profile use ${quoteSlashCommandArg(readField('profile'))} --yes`;
|
|
473
|
-
return {
|
|
474
|
-
kind: 'dispatch',
|
|
475
|
-
command,
|
|
476
|
-
status: 'Opening default Agent profile selection.',
|
|
477
|
-
actionResult: {
|
|
478
|
-
kind: 'dispatched',
|
|
479
|
-
title: 'Opening default Agent profile selection',
|
|
480
|
-
detail: 'The workspace handed a confirmed default profile selection command to the shell-owned command router.',
|
|
481
|
-
command,
|
|
482
|
-
safety: 'safe',
|
|
483
|
-
},
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
if (editor.kind === 'profile-default-clear') {
|
|
487
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
488
|
-
return {
|
|
489
|
-
kind: 'editor',
|
|
490
|
-
editor: { ...editor, message: 'Default Agent profile clear not confirmed. Type yes, then press Enter.' },
|
|
491
|
-
status: 'Default Agent profile clear not confirmed.',
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
const command = '/agent-profile default clear --yes';
|
|
495
|
-
return {
|
|
496
|
-
kind: 'dispatch',
|
|
497
|
-
command,
|
|
498
|
-
status: 'Opening default Agent profile clear.',
|
|
499
|
-
actionResult: {
|
|
500
|
-
kind: 'dispatched',
|
|
501
|
-
title: 'Opening default Agent profile clear',
|
|
502
|
-
detail: 'The workspace handed a confirmed default profile clear command to the shell-owned command router.',
|
|
503
|
-
command,
|
|
504
|
-
safety: 'safe',
|
|
505
|
-
},
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
if (editor.kind === 'profile-delete') {
|
|
509
|
-
if (!isAffirmative(readField('confirm'))) {
|
|
510
|
-
return {
|
|
511
|
-
kind: 'editor',
|
|
512
|
-
editor: { ...editor, message: 'Agent profile delete not confirmed. Type yes, then press Enter.' },
|
|
513
|
-
status: 'Agent profile delete not confirmed.',
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
const command = `/agent-profile delete ${quoteSlashCommandArg(readField('profile'))} --yes`;
|
|
517
|
-
return {
|
|
518
|
-
kind: 'dispatch',
|
|
519
|
-
command,
|
|
520
|
-
status: 'Opening Agent profile deletion.',
|
|
521
|
-
actionResult: {
|
|
522
|
-
kind: 'dispatched',
|
|
523
|
-
title: 'Opening Agent profile deletion',
|
|
524
|
-
detail: 'The workspace handed a confirmed profile deletion command to the shell-owned command router.',
|
|
525
|
-
command,
|
|
526
|
-
safety: 'safe',
|
|
527
|
-
},
|
|
528
|
-
};
|
|
310
|
+
if (isAgentWorkspaceProfileEditorSubmissionKind(editor.kind)) {
|
|
311
|
+
return buildAgentWorkspaceProfileEditorSubmission(editor, readField);
|
|
529
312
|
}
|
|
530
313
|
if (editor.kind === 'support-bundle-export') {
|
|
531
314
|
if (!isAffirmative(readField('confirm'))) {
|
|
@@ -736,6 +519,63 @@ export function buildAgentWorkspaceBasicCommandEditorSubmission(
|
|
|
736
519
|
},
|
|
737
520
|
};
|
|
738
521
|
}
|
|
522
|
+
if (editor.kind === 'skill-standard-import') {
|
|
523
|
+
if (!isAffirmative(readField('confirm'))) {
|
|
524
|
+
return {
|
|
525
|
+
kind: 'editor',
|
|
526
|
+
editor: { ...editor, message: 'Shared skill import not confirmed. Type yes, then press Enter.' },
|
|
527
|
+
status: 'Shared skill import not confirmed.',
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
const parts = [
|
|
531
|
+
'/skills',
|
|
532
|
+
'import-standard',
|
|
533
|
+
quoteSlashCommandArg(readField('path')),
|
|
534
|
+
'--yes',
|
|
535
|
+
];
|
|
536
|
+
const command = parts.join(' ');
|
|
537
|
+
return {
|
|
538
|
+
kind: 'dispatch',
|
|
539
|
+
command,
|
|
540
|
+
status: 'Opening shared skill import.',
|
|
541
|
+
actionResult: {
|
|
542
|
+
kind: 'dispatched',
|
|
543
|
+
title: 'Opening shared skill import',
|
|
544
|
+
detail: 'The workspace handed a confirmed shared skill import command to the shell-owned command router.',
|
|
545
|
+
command,
|
|
546
|
+
safety: 'safe',
|
|
547
|
+
},
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
if (editor.kind === 'skill-standard-export') {
|
|
551
|
+
if (!isAffirmative(readField('confirm'))) {
|
|
552
|
+
return {
|
|
553
|
+
kind: 'editor',
|
|
554
|
+
editor: { ...editor, message: 'Skill export not confirmed. Type yes, then press Enter.' },
|
|
555
|
+
status: 'Skill export not confirmed.',
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
const parts = [
|
|
559
|
+
'/skills',
|
|
560
|
+
'export-standard',
|
|
561
|
+
quoteSlashCommandArg(readField('id')),
|
|
562
|
+
quoteSlashCommandArg(readField('dest')),
|
|
563
|
+
'--yes',
|
|
564
|
+
];
|
|
565
|
+
const command = parts.join(' ');
|
|
566
|
+
return {
|
|
567
|
+
kind: 'dispatch',
|
|
568
|
+
command,
|
|
569
|
+
status: 'Opening skill export.',
|
|
570
|
+
actionResult: {
|
|
571
|
+
kind: 'dispatched',
|
|
572
|
+
title: 'Opening skill export',
|
|
573
|
+
detail: 'The workspace handed a confirmed skill export command to the shell-owned command router.',
|
|
574
|
+
command,
|
|
575
|
+
safety: 'safe',
|
|
576
|
+
},
|
|
577
|
+
};
|
|
578
|
+
}
|
|
739
579
|
if (editor.kind === 'routine-discovery-import') {
|
|
740
580
|
if (!isAffirmative(readField('confirm'))) {
|
|
741
581
|
return {
|
|
@@ -21,14 +21,14 @@ import type { AgentWorkspaceSkillBundleCommandEditorKind } from './agent-workspa
|
|
|
21
21
|
import { createAgentWorkspaceSkillBundleCommandEditor, isAgentWorkspaceSkillBundleCommandEditorKind } from './agent-workspace-skill-bundle-command-editors.ts';
|
|
22
22
|
import type { AgentWorkspaceTaskCommandEditorKind } from './agent-workspace-task-command-editors.ts';
|
|
23
23
|
import { createAgentWorkspaceTaskCommandEditor, isAgentWorkspaceTaskCommandEditorKind } from './agent-workspace-task-command-editors.ts';
|
|
24
|
+
import type { AgentWorkspaceProfileEditorKind } from './agent-workspace-profile-editors.ts';
|
|
25
|
+
import { createAgentWorkspaceProfileEditor, isAgentWorkspaceProfileEditorKind } from './agent-workspace-profile-editors.ts';
|
|
24
26
|
export type { AgentWorkspaceBasicCommandEditorSubmission } from './agent-workspace-basic-command-editor-submission.ts';
|
|
25
27
|
export { buildAgentWorkspaceBasicCommandEditorSubmission } from './agent-workspace-basic-command-editor-submission.ts';
|
|
26
28
|
|
|
27
|
-
export type AgentWorkspaceBasicCommandEditorKind = AgentWorkspaceAccessCommandEditorKind | AgentWorkspaceChannelCommandEditorKind | AgentWorkspaceKnowledgeCommandEditorKind | AgentWorkspaceLibraryCommandEditorKind | AgentWorkspaceMemoryCommandEditorKind | AgentWorkspaceMediaCommandEditorKind | AgentWorkspaceOperationsCommandEditorKind | AgentWorkspaceProviderCommandEditorKind | AgentWorkspaceSessionCommandEditorKind | AgentWorkspaceSkillBundleCommandEditorKind | AgentWorkspaceTaskCommandEditorKind | Extract<
|
|
29
|
+
export type AgentWorkspaceBasicCommandEditorKind = AgentWorkspaceAccessCommandEditorKind | AgentWorkspaceChannelCommandEditorKind | AgentWorkspaceKnowledgeCommandEditorKind | AgentWorkspaceLibraryCommandEditorKind | AgentWorkspaceMemoryCommandEditorKind | AgentWorkspaceMediaCommandEditorKind | AgentWorkspaceOperationsCommandEditorKind | AgentWorkspaceProviderCommandEditorKind | AgentWorkspaceSessionCommandEditorKind | AgentWorkspaceSkillBundleCommandEditorKind | AgentWorkspaceTaskCommandEditorKind | AgentWorkspaceProfileEditorKind | Extract<
|
|
28
30
|
AgentWorkspaceEditorKind,
|
|
29
|
-
'knowledge-file' | 'knowledge-urls' | 'knowledge-bookmarks' | 'knowledge-browser-history' | 'knowledge-connector-ingest' | 'knowledge-reindex' | 'tts-prompt' | 'image-input' | 'skill-bundle' | 'skill-discovery-import'
|
|
30
|
-
| 'profile-template-from-discovered' | 'profile-from-discovered' | 'profile-default' | 'profile-default-clear'
|
|
31
|
-
| 'profile-template-show' | 'profile-show' | 'profile-delete'
|
|
31
|
+
'knowledge-file' | 'knowledge-urls' | 'knowledge-bookmarks' | 'knowledge-browser-history' | 'knowledge-connector-ingest' | 'knowledge-reindex' | 'tts-prompt' | 'image-input' | 'skill-bundle' | 'skill-discovery-import'
|
|
32
32
|
| 'support-bundle-export' | 'support-bundle-inspect' | 'support-bundle-import'
|
|
33
33
|
| 'subscription-inspect' | 'subscription-login-start' | 'subscription-login-finish' | 'subscription-logout'
|
|
34
34
|
| 'model-pin' | 'model-unpin'
|
|
@@ -36,6 +36,8 @@ export type AgentWorkspaceBasicCommandEditorKind = AgentWorkspaceAccessCommandEd
|
|
|
36
36
|
| 'workplan-add' | 'workplan-show' | 'workplan-status' | 'workplan-delete' | 'workplan-clear-completed'
|
|
37
37
|
| 'persona-discovery-import'
|
|
38
38
|
| 'routine-discovery-import'
|
|
39
|
+
| 'skill-standard-import'
|
|
40
|
+
| 'skill-standard-export'
|
|
39
41
|
| 'mcp-server' | 'mcp-tools-server' | 'mcp-repair' | 'notify-webhook' | 'notify-webhook-remove' | 'notify-webhook-clear' | 'notify-webhook-test' | 'notify-send'
|
|
40
42
|
| 'secret-set' | 'secret-link' | 'secret-test' | 'secret-delete'
|
|
41
43
|
>;
|
|
@@ -64,15 +66,9 @@ export function isAgentWorkspaceBasicCommandEditorKind(kind: AgentWorkspaceEdito
|
|
|
64
66
|
|| kind === 'persona-discovery-import'
|
|
65
67
|
|| kind === 'routine-discovery-import'
|
|
66
68
|
|| kind === 'skill-discovery-import'
|
|
67
|
-
|| kind === '
|
|
68
|
-
|| kind === '
|
|
69
|
-
|| kind
|
|
70
|
-
|| kind === 'profile-from-discovered'
|
|
71
|
-
|| kind === 'profile-default'
|
|
72
|
-
|| kind === 'profile-default-clear'
|
|
73
|
-
|| kind === 'profile-template-show'
|
|
74
|
-
|| kind === 'profile-show'
|
|
75
|
-
|| kind === 'profile-delete'
|
|
69
|
+
|| kind === 'skill-standard-import'
|
|
70
|
+
|| kind === 'skill-standard-export'
|
|
71
|
+
|| isAgentWorkspaceProfileEditorKind(kind)
|
|
76
72
|
|| kind === 'support-bundle-export'
|
|
77
73
|
|| kind === 'support-bundle-inspect'
|
|
78
74
|
|| kind === 'support-bundle-import'
|
|
@@ -136,6 +132,9 @@ export function createAgentWorkspaceBasicCommandEditor(kind: AgentWorkspaceBasic
|
|
|
136
132
|
if (isAgentWorkspaceTaskCommandEditorKind(kind)) {
|
|
137
133
|
return createAgentWorkspaceTaskCommandEditor(kind);
|
|
138
134
|
}
|
|
135
|
+
if (isAgentWorkspaceProfileEditorKind(kind)) {
|
|
136
|
+
return createAgentWorkspaceProfileEditor(kind);
|
|
137
|
+
}
|
|
139
138
|
if (kind === 'knowledge-bookmarks') {
|
|
140
139
|
return {
|
|
141
140
|
kind,
|
|
@@ -439,134 +438,6 @@ export function createAgentWorkspaceBasicCommandEditor(kind: AgentWorkspaceBasic
|
|
|
439
438
|
],
|
|
440
439
|
};
|
|
441
440
|
}
|
|
442
|
-
if (kind === 'profile-template-export') {
|
|
443
|
-
return {
|
|
444
|
-
kind,
|
|
445
|
-
mode: 'create',
|
|
446
|
-
title: 'Export Agent Starter Template',
|
|
447
|
-
selectedFieldIndex: 0,
|
|
448
|
-
message: 'Export a starter template JSON file for review and customization. Type yes on the final field to confirm.',
|
|
449
|
-
fields: [
|
|
450
|
-
{ id: 'templateId', label: 'Starter id', value: '', required: true, multiline: false, hint: 'Existing starter id from /agent-profile templates.' },
|
|
451
|
-
{ id: 'path', label: 'Output path', value: '', required: true, multiline: false, hint: 'Workspace-relative JSON path to write.' },
|
|
452
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile template export with --yes.' },
|
|
453
|
-
],
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
if (kind === 'profile-template-import') {
|
|
457
|
-
return {
|
|
458
|
-
kind,
|
|
459
|
-
mode: 'create',
|
|
460
|
-
title: 'Import Agent Starter Template',
|
|
461
|
-
selectedFieldIndex: 0,
|
|
462
|
-
message: 'Import a reviewed starter template JSON file into this Agent home. Type yes on the final field to confirm.',
|
|
463
|
-
fields: [
|
|
464
|
-
{ id: 'path', label: 'Template path', value: '', required: true, multiline: false, hint: 'Workspace-relative JSON path to import.' },
|
|
465
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile template import with --yes.' },
|
|
466
|
-
],
|
|
467
|
-
};
|
|
468
|
-
}
|
|
469
|
-
if (kind === 'profile-template-show') {
|
|
470
|
-
return {
|
|
471
|
-
kind,
|
|
472
|
-
mode: 'create',
|
|
473
|
-
title: 'Preview Agent Starter Template',
|
|
474
|
-
selectedFieldIndex: 0,
|
|
475
|
-
message: 'Preview one built-in or local starter template before creating or exporting a profile.',
|
|
476
|
-
fields: [
|
|
477
|
-
{ id: 'id', label: 'Starter id', value: '', required: true, multiline: false, hint: 'Starter template id from /agent-profile templates.' },
|
|
478
|
-
],
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
if (kind === 'profile-show') {
|
|
482
|
-
return {
|
|
483
|
-
kind,
|
|
484
|
-
mode: 'create',
|
|
485
|
-
title: 'Show Agent Profile',
|
|
486
|
-
selectedFieldIndex: 0,
|
|
487
|
-
message: 'Show one isolated Agent profile home, starter metadata, and launch command.',
|
|
488
|
-
fields: [
|
|
489
|
-
{ id: 'profile', label: 'Profile name', value: '', required: true, multiline: false, hint: 'Existing isolated Agent profile name from /agent-profile list.' },
|
|
490
|
-
],
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
if (kind === 'profile-template-from-discovered') {
|
|
494
|
-
return {
|
|
495
|
-
kind,
|
|
496
|
-
mode: 'create',
|
|
497
|
-
title: 'Create Starter from Discovered Behavior',
|
|
498
|
-
selectedFieldIndex: 0,
|
|
499
|
-
message: 'Create an Agent-local starter template from reviewed discovered persona, skill, and routine markdown. Type yes on the final field to confirm.',
|
|
500
|
-
fields: [
|
|
501
|
-
{ id: 'id', label: 'Starter id', value: '', required: true, multiline: false, hint: 'New local starter id, for example research-desk.' },
|
|
502
|
-
{ id: 'name', label: 'Starter name', value: '', required: false, multiline: false, hint: 'Optional display name. Defaults to the selected persona name.' },
|
|
503
|
-
{ id: 'description', label: 'Description', value: '', required: false, multiline: false, hint: 'Optional one-line summary.' },
|
|
504
|
-
{ id: 'persona', label: 'Persona', value: '', required: false, multiline: false, hint: 'Optional discovered persona name/path. Blank uses the first discovered persona.' },
|
|
505
|
-
{ id: 'skills', label: 'Skills', value: '', required: false, multiline: false, hint: 'all or comma-separated discovered skill names. Blank includes all.' },
|
|
506
|
-
{ id: 'routines', label: 'Routines', value: '', required: false, multiline: false, hint: 'all or comma-separated discovered routine names. Blank includes all.' },
|
|
507
|
-
{ id: 'replace', label: 'Replace existing', value: 'no', required: false, multiline: false, hint: 'yes/no. Existing starter ids are protected unless this is yes.' },
|
|
508
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile template from-discovered with --yes.' },
|
|
509
|
-
],
|
|
510
|
-
};
|
|
511
|
-
}
|
|
512
|
-
if (kind === 'profile-from-discovered') {
|
|
513
|
-
return {
|
|
514
|
-
kind,
|
|
515
|
-
mode: 'create',
|
|
516
|
-
title: 'Create Profile from Discovered Behavior',
|
|
517
|
-
selectedFieldIndex: 0,
|
|
518
|
-
message: 'Create a local starter template and isolated Agent profile from reviewed discovered behavior markdown. Type yes on the final field to confirm.',
|
|
519
|
-
fields: [
|
|
520
|
-
{ id: 'profile', label: 'Profile name', value: '', required: true, multiline: false, hint: 'New isolated Agent profile name, for example research-desk.' },
|
|
521
|
-
{ id: 'templateId', label: 'Starter id', value: '', required: false, multiline: false, hint: 'Optional local starter id. Blank uses the profile name.' },
|
|
522
|
-
{ id: 'name', label: 'Starter name', value: '', required: false, multiline: false, hint: 'Optional display name for the generated starter.' },
|
|
523
|
-
{ id: 'description', label: 'Description', value: '', required: false, multiline: false, hint: 'Optional one-line summary.' },
|
|
524
|
-
{ id: 'persona', label: 'Persona', value: '', required: false, multiline: false, hint: 'Optional discovered persona name/path. Blank uses the first discovered persona.' },
|
|
525
|
-
{ id: 'skills', label: 'Skills', value: '', required: false, multiline: false, hint: 'all or comma-separated discovered skill names. Blank includes all.' },
|
|
526
|
-
{ id: 'routines', label: 'Routines', value: '', required: false, multiline: false, hint: 'all or comma-separated discovered routine names. Blank includes all.' },
|
|
527
|
-
{ id: 'replace', label: 'Replace starter', value: 'no', required: false, multiline: false, hint: 'yes/no. Existing starter ids are protected unless this is yes.' },
|
|
528
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile create-from-discovered with --yes.' },
|
|
529
|
-
],
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
if (kind === 'profile-default') {
|
|
533
|
-
return {
|
|
534
|
-
kind,
|
|
535
|
-
mode: 'update',
|
|
536
|
-
title: 'Use Default Agent Profile',
|
|
537
|
-
selectedFieldIndex: 0,
|
|
538
|
-
message: 'Select which isolated Agent profile the next plain goodvibes-agent run should use. Type yes on the final field to confirm.',
|
|
539
|
-
fields: [
|
|
540
|
-
{ id: 'profile', label: 'Profile name', value: '', required: true, multiline: false, hint: 'Existing isolated Agent profile name from /agent-profile list.' },
|
|
541
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile use with --yes.' },
|
|
542
|
-
],
|
|
543
|
-
};
|
|
544
|
-
}
|
|
545
|
-
if (kind === 'profile-default-clear') {
|
|
546
|
-
return {
|
|
547
|
-
kind,
|
|
548
|
-
mode: 'update',
|
|
549
|
-
title: 'Clear Default Agent Profile',
|
|
550
|
-
selectedFieldIndex: 0,
|
|
551
|
-
message: 'Return the next plain goodvibes-agent run to the base Agent home. Type yes to confirm.',
|
|
552
|
-
fields: [
|
|
553
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile default clear with --yes.' },
|
|
554
|
-
],
|
|
555
|
-
};
|
|
556
|
-
}
|
|
557
|
-
if (kind === 'profile-delete') {
|
|
558
|
-
return {
|
|
559
|
-
kind,
|
|
560
|
-
mode: 'delete',
|
|
561
|
-
title: 'Delete Agent Profile',
|
|
562
|
-
selectedFieldIndex: 0,
|
|
563
|
-
message: 'Delete one isolated Agent profile home. Type yes on the final field to confirm.',
|
|
564
|
-
fields: [
|
|
565
|
-
{ id: 'profile', label: 'Profile name', value: '', required: true, multiline: false, hint: 'Existing isolated Agent profile name from /agent-profile list.' },
|
|
566
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /agent-profile delete with --yes.' },
|
|
567
|
-
],
|
|
568
|
-
};
|
|
569
|
-
}
|
|
570
441
|
if (kind === 'support-bundle-export') {
|
|
571
442
|
return {
|
|
572
443
|
kind,
|
|
@@ -783,6 +654,33 @@ export function createAgentWorkspaceBasicCommandEditor(kind: AgentWorkspaceBasic
|
|
|
783
654
|
],
|
|
784
655
|
};
|
|
785
656
|
}
|
|
657
|
+
if (kind === 'skill-standard-import') {
|
|
658
|
+
return {
|
|
659
|
+
kind,
|
|
660
|
+
mode: 'create',
|
|
661
|
+
title: 'Import Shared Skill',
|
|
662
|
+
selectedFieldIndex: 0,
|
|
663
|
+
message: 'Import one SKILL.md file in the open skill format into the Agent-local skill library. The skill will wait for your review before it can be enabled.',
|
|
664
|
+
fields: [
|
|
665
|
+
{ id: 'path', label: 'Path to SKILL.md', value: '', required: true, multiline: false, hint: 'Full path to a SKILL.md file.' },
|
|
666
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to import with --yes.' },
|
|
667
|
+
],
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
if (kind === 'skill-standard-export') {
|
|
671
|
+
return {
|
|
672
|
+
kind,
|
|
673
|
+
mode: 'create',
|
|
674
|
+
title: 'Export Skill to Share',
|
|
675
|
+
selectedFieldIndex: 0,
|
|
676
|
+
message: 'Export one Agent-local skill as a SKILL.md folder you can publish or hand to another assistant.',
|
|
677
|
+
fields: [
|
|
678
|
+
{ id: 'id', label: 'Skill id or name', value: '', required: true, multiline: false, hint: 'Local skill id or name.' },
|
|
679
|
+
{ id: 'dest', label: 'Destination folder', value: '', required: true, multiline: false, hint: 'Directory to write <slug>/SKILL.md into.' },
|
|
680
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to export with --yes.' },
|
|
681
|
+
],
|
|
682
|
+
};
|
|
683
|
+
}
|
|
786
684
|
return {
|
|
787
685
|
kind,
|
|
788
686
|
mode: 'create',
|