@pstdio/sdk 0.40.0 → 0.42.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.
@@ -6263,6 +6263,7 @@ var agentSkillsLayoutSchema = object({
6263
6263
  });
6264
6264
  var localizableSchema = union([string2(), object({ $l10n: string2(), default: string2().optional() })]);
6265
6265
  var harnessParamBaseSchema = object({
6266
+ control: literal("command").optional(),
6266
6267
  label: localizableSchema.optional(),
6267
6268
  description: localizableSchema.optional(),
6268
6269
  required: boolean2().optional(),
@@ -6283,7 +6284,10 @@ var harnessParamsSchema = record(string2(), harnessParamDescriptorSchema);
6283
6284
  var agentInfoSchema = object({
6284
6285
  id: string2(),
6285
6286
  name: string2(),
6286
- availability: object({ type: agentAvailabilityTypeSchema }),
6287
+ availability: object({
6288
+ type: agentAvailabilityTypeSchema,
6289
+ reason: string2().optional()
6290
+ }),
6287
6291
  skills: agentSkillsLayoutSchema.optional(),
6288
6292
  params: harnessParamsSchema.optional()
6289
6293
  });
@@ -6478,6 +6482,10 @@ var extensionCommandRecordSchema = object({
6478
6482
  examples: array(string2()).optional(),
6479
6483
  automation: boolean2().optional(),
6480
6484
  mutating: boolean2().optional(),
6485
+ resourceMutation: discriminatedUnion("kind", [
6486
+ object({ kind: literal("rename"), resourceType: string2(), idParam: string2(), labelParam: string2() }),
6487
+ object({ kind: literal("remove"), resourceType: string2(), idParam: string2() })
6488
+ ]).optional(),
6481
6489
  params: record(string2(), object({ type: string2() }).catchall(unknown())).optional()
6482
6490
  });
6483
6491
  var extensionParamObjectSchema = record(string2(), object({ type: string2() }).catchall(unknown()));
@@ -6597,6 +6605,29 @@ var isNavigationHref = (href) => {
6597
6605
  }
6598
6606
  };
6599
6607
 
6608
+ // ../pstdio-api-contracts/src/extension-kernel/source-position.ts
6609
+ var isFileSourcePosition = (value) => {
6610
+ if (!value || typeof value !== "object" || Array.isArray(value))
6611
+ return false;
6612
+ const position = value;
6613
+ const positive = (number) => typeof number === "number" && Number.isSafeInteger(number) && number > 0;
6614
+ if (!positive(position.line))
6615
+ return false;
6616
+ for (const key of ["column", "endLine", "endColumn"]) {
6617
+ if (position[key] !== undefined && !positive(position[key]))
6618
+ return false;
6619
+ }
6620
+ if (position.endColumn !== undefined && position.endLine === undefined)
6621
+ return false;
6622
+ if (position.endLine !== undefined) {
6623
+ if (position.endLine < position.line)
6624
+ return false;
6625
+ if (position.endLine === position.line && (position.endColumn ?? 1) < (position.column ?? 1))
6626
+ return false;
6627
+ }
6628
+ return true;
6629
+ };
6630
+
6600
6631
  // ../pstdio-api-contracts/src/extensions/resource-ref.ts
6601
6632
  var extensionResourceRefSchema = object({
6602
6633
  shorthand: string2().optional(),
@@ -6628,6 +6659,12 @@ var commandTargetSchema = object({
6628
6659
  });
6629
6660
 
6630
6661
  // ../pstdio-api-contracts/src/extensions/navigation-target-metadata.ts
6662
+ var sourcePositionSchema = object({
6663
+ line: number2().int().positive(),
6664
+ column: number2().int().positive().optional(),
6665
+ endLine: number2().int().positive().optional(),
6666
+ endColumn: number2().int().positive().optional()
6667
+ }).refine(isFileSourcePosition, "Expected ordered source coordinates");
6631
6668
  var sectionSchema = object({
6632
6669
  anchors: array(object({ id: string2(), heading: string2(), occurrence: number2().int().nonnegative().optional() }))
6633
6670
  });
@@ -6637,8 +6674,9 @@ var pageTargetSchema = lazy(() => object({
6637
6674
  resource: extensionResourceRefSchema.optional(),
6638
6675
  open: _enum(["preview", "pin"]).optional(),
6639
6676
  section: sectionSchema.optional(),
6677
+ position: sourcePositionSchema.optional(),
6640
6678
  parent: pageTargetSchema.optional()
6641
- })).meta({ id: "WorkbenchMetadataPageTarget" });
6679
+ }).refine((value) => !(value.position && value.section), "Choose a source position or a heading section")).meta({ id: "WorkbenchMetadataPageTarget" });
6642
6680
  var navigationOperationSchema = union([
6643
6681
  pageTargetSchema,
6644
6682
  object({
@@ -6912,6 +6950,7 @@ var extensionTreeRendererRecordSchema = extensionRendererRecordBaseSchema.extend
6912
6950
  headerHandlerId: string2().optional(),
6913
6951
  bodyHandlerId: string2(),
6914
6952
  childrenHandlerId: string2().optional(),
6953
+ moveHandlerId: string2().optional(),
6915
6954
  footerHandlerId: string2().optional(),
6916
6955
  defaultExpandedSectionIds: array(string2()).optional(),
6917
6956
  defaultExpandedNodeIds: array(string2()).optional()
@@ -6930,6 +6969,105 @@ var extensionControlsRendererRecordSchema = extensionRendererRecordBaseSchema.ex
6930
6969
  defaultValues: controlValuesSchema.optional()
6931
6970
  });
6932
6971
 
6972
+ // ../pstdio-api-contracts/src/extension-kernel/types/collection-view.ts
6973
+ var optionConditions = ["is-any-of", "is-none-of", "is-empty", "is-not-empty"];
6974
+ var VIEW_FILTER_CONDITIONS = {
6975
+ boolean: ["is", "is-not", "is-empty", "is-not-empty"],
6976
+ string: ["contains", "does-not-contain", "is", "is-not", "is-empty", "is-not-empty"],
6977
+ number: ["is", "is-not", "gt", "gte", "lt", "lte", "is-empty", "is-not-empty"],
6978
+ date: ["is", "is-before", "is-after", "is-on-or-before", "is-on-or-after", "is-empty", "is-not-empty"],
6979
+ enum: optionConditions,
6980
+ status: optionConditions,
6981
+ user: optionConditions,
6982
+ "enum-multi": ["has-any-of", "has-all-of", "has-none-of", "is-empty", "is-not-empty"]
6983
+ };
6984
+
6985
+ // ../pstdio-api-contracts/src/extensions/collection-view.ts
6986
+ var VIEW_DAY_PATTERN = /^(\d{4}-\d{2}-\d{2}|today([+-]\d+)?)$/;
6987
+ var conditionIds = [...new Set(Object.values(VIEW_FILTER_CONDITIONS).flat())];
6988
+ var viewFilterConditionSchema = _enum(conditionIds);
6989
+ var viewFilterRuleSchema = object({
6990
+ attributeId: string2().min(1),
6991
+ condition: viewFilterConditionSchema,
6992
+ value: union([boolean2(), string2(), number2(), array(string2())]).optional()
6993
+ });
6994
+ var advancedFilterGroupSchema = strictObject({
6995
+ conjunction: _enum(["and", "or"]),
6996
+ rules: array(viewFilterRuleSchema)
6997
+ });
6998
+ var viewFilterGroupSchema = advancedFilterGroupSchema.extend({
6999
+ groups: array(advancedFilterGroupSchema).optional()
7000
+ }).refine((filter) => !filter.groups?.length || filter.conjunction === "and", {
7001
+ message: "Normal rules and advanced groups combine using AND"
7002
+ });
7003
+ var viewSortSchema = object({ attributeId: string2().min(1), direction: _enum(["asc", "desc"]) });
7004
+ var viewSortsSchema = array(viewSortSchema).max(1, "A view allows only one sort");
7005
+ var viewFilterValueKind = (kind, condition) => {
7006
+ if (condition === "is-empty" || condition === "is-not-empty")
7007
+ return "none";
7008
+ if (condition === "is-any-of" || condition === "is-none-of")
7009
+ return "options";
7010
+ if (kind === "boolean")
7011
+ return "boolean";
7012
+ if (kind === "number")
7013
+ return "number";
7014
+ if (kind === "date")
7015
+ return "day";
7016
+ if (kind === "string")
7017
+ return "text";
7018
+ return "options";
7019
+ };
7020
+ var valueNeeds = {
7021
+ none: "takes no value",
7022
+ boolean: "needs a boolean",
7023
+ number: "needs a number",
7024
+ day: "needs a day such as 2026-10-02, today, or today-7",
7025
+ text: "needs text",
7026
+ options: "needs a list of option values"
7027
+ };
7028
+ var valueFits = (value, kind) => {
7029
+ if (value === undefined)
7030
+ return true;
7031
+ if (kind === "none")
7032
+ return false;
7033
+ if (kind === "boolean")
7034
+ return typeof value === "boolean";
7035
+ if (kind === "number")
7036
+ return typeof value === "number" && Number.isFinite(value);
7037
+ if (kind === "day")
7038
+ return typeof value === "string" && VIEW_DAY_PATTERN.test(value);
7039
+ if (kind === "text")
7040
+ return typeof value === "string";
7041
+ return Array.isArray(value);
7042
+ };
7043
+ var ruleProblem = (rule, fields) => {
7044
+ const filterable = fields.filter((field) => field.filterable);
7045
+ const field = filterable.find((field) => field.id === rule.attributeId);
7046
+ if (!field)
7047
+ return `Invalid filter field "${rule.attributeId}". Valid IDs: ${filterable.map((field) => field.id).join(", ")}`;
7048
+ const conditions = VIEW_FILTER_CONDITIONS[field.kind];
7049
+ const legacyList = ["is-any-of", "is-none-of"].includes(rule.condition) && ["string", "number", "date"].includes(field.kind);
7050
+ if (!conditions.includes(rule.condition) && !legacyList)
7051
+ return `Field "${field.id}" does not accept "${rule.condition}". Valid conditions: ${conditions.join(", ")}`;
7052
+ const valueKind = viewFilterValueKind(field.kind, rule.condition);
7053
+ if (!valueFits(rule.value, valueKind))
7054
+ return `Condition "${rule.condition}" on "${field.id}" ${valueNeeds[valueKind]}`;
7055
+ const options = field.options;
7056
+ const values = Array.isArray(rule.value) ? rule.value : [];
7057
+ const unknown = options ? values.find((value) => !options.some((option) => option.value === value)) : undefined;
7058
+ if (options && unknown !== undefined)
7059
+ return `Invalid filter value "${unknown}" for "${field.id}". Valid values: ${options.map((option) => option.value).join(", ")}`;
7060
+ return;
7061
+ };
7062
+ var findViewFilterProblem = (filter, fields) => {
7063
+ for (const rule of [...filter.rules, ...(filter.groups ?? []).flatMap((group) => group.rules)]) {
7064
+ const problem = ruleProblem(rule, fields);
7065
+ if (problem)
7066
+ return problem;
7067
+ }
7068
+ return;
7069
+ };
7070
+
6933
7071
  // ../pstdio-api-contracts/src/extensions/view-toolbar-action.ts
6934
7072
  var viewToolbarActionSchema = object({
6935
7073
  id: string2(),
@@ -6969,12 +7107,30 @@ var columnRendererSchema = discriminatedUnion("type", [
6969
7107
  var dataTableRendererColumnSchema = object({
6970
7108
  id: string2(),
6971
7109
  label: localizableStringSchema.optional(),
7110
+ type: _enum(["string", "number", "boolean", "date"]).optional(),
7111
+ groupable: boolean2().optional(),
7112
+ filterable: boolean2().optional(),
6972
7113
  description: localizableStringSchema.optional(),
6973
7114
  icon: string2().optional(),
6974
7115
  hidden: boolean2().optional(),
6975
7116
  stat: columnStatSchema.optional(),
6976
7117
  renderer: columnRendererSchema.optional()
6977
7118
  });
7119
+ var dataTableRendererSettingsSchema = object({
7120
+ grouping: string2(),
7121
+ rowNumbers: boolean2(),
7122
+ wrapRows: boolean2(),
7123
+ showStats: boolean2(),
7124
+ hiddenColumns: array(string2()),
7125
+ columnOrder: array(string2())
7126
+ });
7127
+ var dataTableRendererSavedViewSchema = object({
7128
+ id: string2(),
7129
+ title: localizableStringSchema,
7130
+ settings: dataTableRendererSettingsSchema.partial().optional(),
7131
+ filter: viewFilterGroupSchema.optional(),
7132
+ sorts: viewSortsSchema.optional()
7133
+ });
6978
7134
  var rowActionSchema = object({
6979
7135
  id: string2(),
6980
7136
  label: localizableStringSchema,
@@ -6998,7 +7154,12 @@ var extensionDataTableRendererRecordSchema = extensionRendererRecordBaseSchema.e
6998
7154
  rowActions: array(rowActionSchema).optional(),
6999
7155
  rowActivationHandlerId: string2().optional(),
7000
7156
  initialPageSize: number2().int().positive().optional(),
7001
- pageSizeOptions: array(number2().int().positive()).optional()
7157
+ pageSizeOptions: array(number2().int().positive()).optional(),
7158
+ defaultSettings: dataTableRendererSettingsSchema.partial().optional(),
7159
+ defaultFilter: viewFilterGroupSchema.optional(),
7160
+ defaultSorts: viewSortsSchema.optional(),
7161
+ defaultViews: array(dataTableRendererSavedViewSchema).optional(),
7162
+ defaultActiveViewId: string2().optional()
7002
7163
  });
7003
7164
 
7004
7165
  // ../pstdio-api-contracts/src/extensions/kanban-renderer.ts
@@ -7019,6 +7180,7 @@ var kanbanRendererAttributeTypeSchema = discriminatedUnion("kind", [
7019
7180
  id: string2()
7020
7181
  })
7021
7182
  }),
7183
+ object({ kind: literal("boolean"), legacyValues: record(string2(), boolean2()).optional() }),
7022
7184
  object({ kind: literal("string") }),
7023
7185
  object({ kind: literal("date") }),
7024
7186
  object({ kind: literal("number") }),
@@ -7039,21 +7201,18 @@ var kanbanRendererAttributeSchema = object({
7039
7201
  editable: boolean2().optional(),
7040
7202
  display: kanbanRendererAttributeDisplaySchema.optional()
7041
7203
  });
7042
- var kanbanRendererSettingsSchema = object({
7204
+ var kanbanViewSettingsSchema = object({
7043
7205
  viewMode: _enum(["board", "list"]),
7044
7206
  columnGrouping: string2(),
7045
7207
  rowGrouping: string2(),
7046
- ordering: object({
7047
- attributeId: string2(),
7048
- direction: _enum(["asc", "desc"])
7049
- }),
7050
7208
  displayProperties: array(string2())
7051
7209
  });
7052
7210
  var kanbanRendererSavedViewSchema = object({
7053
7211
  id: string2(),
7054
7212
  title: localizableStringSchema,
7055
- settings: kanbanRendererSettingsSchema,
7056
- filters: record(string2(), array(string2())),
7213
+ settings: kanbanViewSettingsSchema,
7214
+ filter: viewFilterGroupSchema,
7215
+ sorts: viewSortsSchema,
7057
7216
  isDefault: boolean2().optional()
7058
7217
  });
7059
7218
  var extensionKanbanRendererCreateRowSchema = object({
@@ -7093,8 +7252,9 @@ var extensionKanbanRendererRecordSchema = extensionRendererRecordBaseSchema.exte
7093
7252
  createRow: extensionKanbanRendererCreateRowSchema.optional(),
7094
7253
  rowActions: array(extensionKanbanRendererRowActionSchema).optional(),
7095
7254
  rowActivationHandlerId: string2().optional(),
7096
- defaultSettings: kanbanRendererSettingsSchema.partial().optional(),
7097
- defaultFilters: record(string2(), array(string2())).optional(),
7255
+ defaultSettings: kanbanViewSettingsSchema.partial().optional(),
7256
+ defaultFilter: viewFilterGroupSchema.optional(),
7257
+ defaultSorts: viewSortsSchema.optional(),
7098
7258
  defaultViews: array(kanbanRendererSavedViewSchema).optional(),
7099
7259
  defaultActiveViewId: string2().optional(),
7100
7260
  hideToolbar: boolean2().optional()
@@ -7190,6 +7350,7 @@ var workbenchExtensionPageRecordSchema = object({
7190
7350
  title: localizableStringSchema,
7191
7351
  icon: string2().optional(),
7192
7352
  path: string2(),
7353
+ document: object({ metadataKey: string2().refine((key) => key.trim().length > 0) }).optional(),
7193
7354
  mode: modeRefSchema,
7194
7355
  parent: pageRefSchema.optional(),
7195
7356
  resource: resourceConstraintSchema.optional(),
@@ -7212,6 +7373,12 @@ var extensionSettingsPanelRecordSchema = object({
7212
7373
  section: string2().optional(),
7213
7374
  webview: extensionWebviewContributionSchema
7214
7375
  });
7376
+ var extensionSettingOptionSourceSchema = object({
7377
+ commandId: string2(),
7378
+ valueField: string2(),
7379
+ labelField: string2(),
7380
+ params: record(string2(), unknown()).optional()
7381
+ });
7215
7382
  var extensionSettingDefinitionRecordSchema = object({
7216
7383
  key: string2(),
7217
7384
  extensionId: string2(),
@@ -7219,6 +7386,7 @@ var extensionSettingDefinitionRecordSchema = object({
7219
7386
  scope: extensionSettingScopeSchema,
7220
7387
  default: unknown().optional(),
7221
7388
  enum: array(unknown()).optional(),
7389
+ options: extensionSettingOptionSourceSchema.optional(),
7222
7390
  title: localizableStringSchema.optional(),
7223
7391
  description: localizableStringSchema.optional()
7224
7392
  });
@@ -7263,8 +7431,7 @@ var rendererBaseOmissions = {
7263
7431
  id: true,
7264
7432
  extensionId: true,
7265
7433
  title: true,
7266
- icon: true,
7267
- resourceKind: true
7434
+ icon: true
7268
7435
  };
7269
7436
  var commandActionSchema = object({
7270
7437
  id: string2(),
@@ -7379,6 +7546,7 @@ var workbenchExtensionResourceKindRecordSchema = object({
7379
7546
  label: localizableStringSchema.optional(),
7380
7547
  icon: string2().optional(),
7381
7548
  resolveCommand: string2().optional(),
7549
+ resolveManyCommand: string2().optional(),
7382
7550
  menuSlots: array(object({
7383
7551
  id: string2(),
7384
7552
  placement: _enum(["header-primary", "header-overflow", "context-menu"]),
@@ -7535,6 +7703,15 @@ var listExtensionAppearanceResponseSchema = object({
7535
7703
  translations: array(extensionTranslationRecordSchema),
7536
7704
  diagnostics: workbenchExtensionMetadataSchema.shape.diagnostics
7537
7705
  });
7706
+ // ../pstdio-api-contracts/src/extension-kernel/types/data-table-renderer.ts
7707
+ var DEFAULT_DATA_TABLE_SETTINGS = {
7708
+ grouping: "none",
7709
+ rowNumbers: true,
7710
+ wrapRows: false,
7711
+ showStats: true,
7712
+ hiddenColumns: [],
7713
+ columnOrder: []
7714
+ };
7538
7715
  // ../pstdio-api-contracts/src/extensions/install.ts
7539
7716
  var enableInstalledExtensionRequestSchema = object({
7540
7717
  displayName: string2(),
@@ -7623,6 +7800,57 @@ var setupProjectExtensionResponseSchema = object({
7623
7800
  installedAgents: array(string2())
7624
7801
  }))
7625
7802
  });
7803
+ // ../pstdio-api-contracts/src/extensions/installation.ts
7804
+ var installNameSchema = string2().min(1).refine((name) => name !== "." && name !== ".." && !/[\\/:]/.test(name) && name.trim().length > 0, "Install name must be one folder name.");
7805
+ var installExtensionRequestSchema = object({
7806
+ source: discriminatedUnion("kind", [
7807
+ object({ kind: literal("catalog"), name: string2().min(1), ref: string2().min(1).optional() }).strict(),
7808
+ object({ kind: literal("project-folder"), path: string2().min(1), development: boolean2().optional() }).strict()
7809
+ ]),
7810
+ installName: installNameSchema.optional(),
7811
+ force: boolean2().optional(),
7812
+ skipInstall: boolean2().optional()
7813
+ }).strict();
7814
+ var formBoolean = _enum(["true", "false"]).optional().transform((value) => value === "true");
7815
+ var uploadExtensionRequestSchema = object({
7816
+ kind: literal("upload"),
7817
+ installName: installNameSchema.optional(),
7818
+ folderName: installNameSchema,
7819
+ files: preprocess((value) => Array.isArray(value) ? value : [value], array(_instanceof(File).meta({ type: "string", format: "binary" })).min(1)),
7820
+ force: formBoolean,
7821
+ skipInstall: formBoolean,
7822
+ development: formBoolean
7823
+ }).strict();
7824
+ var installedExtensionSourceSchema = object({
7825
+ check: extensionsCheckResponseSchema,
7826
+ installName: string2(),
7827
+ manifest: record(string2(), unknown()),
7828
+ metadata: object({
7829
+ id: string2(),
7830
+ name: string2(),
7831
+ displayName: string2(),
7832
+ version: string2(),
7833
+ description: string2().optional(),
7834
+ enginesPstdio: string2()
7835
+ }),
7836
+ source: discriminatedUnion("kind", [
7837
+ object({ kind: literal("local"), path: string2(), ref: string2().optional() }),
7838
+ object({ kind: literal("named"), name: string2(), ref: string2() })
7839
+ ]),
7840
+ sourceHash: string2(),
7841
+ targetPath: string2()
7842
+ });
7843
+ var installExtensionResponseSchema = object({
7844
+ source: installedExtensionSourceSchema,
7845
+ extension: projectExtensionInstanceSchema
7846
+ });
7847
+ var extensionDiagnosticsResponseSchema = object({
7848
+ roots: array(object({
7849
+ scope: _enum(["repo", "user"]),
7850
+ path: string2(),
7851
+ check: extensionsCheckResponseSchema
7852
+ }))
7853
+ });
7626
7854
  // ../pstdio-api-contracts/src/automation.ts
7627
7855
  var automationRunStatusSchema = _enum(["queued", "running", "succeeded", "failed", "cancelled", "rejected"]);
7628
7856
  var issueAutomationTokenInputSchema = object({
@@ -7683,33 +7911,38 @@ var listAutomationRunEventsResponseSchema = object({ events: array(automationRun
7683
7911
  var boardFieldSchema = object({
7684
7912
  id: string2(),
7685
7913
  label: string2(),
7686
- kind: _enum(["enum", "enum-multi", "status", "string", "date", "number", "user"]),
7914
+ kind: _enum(["enum", "enum-multi", "status", "string", "date", "number", "boolean", "user"]),
7915
+ conditions: array(viewFilterConditionSchema),
7687
7916
  filterable: boolean2(),
7688
7917
  groupable: boolean2(),
7689
7918
  sortable: boolean2(),
7690
7919
  displayable: boolean2(),
7920
+ legacyValues: record(string2(), boolean2()).optional(),
7691
7921
  options: array(object({ value: string2(), label: string2() })).optional()
7692
7922
  });
7693
7923
  var boardSummarySchema = object({
7694
7924
  id: string2(),
7695
7925
  title: string2(),
7696
- extensionId: string2(),
7926
+ kind: _enum(["kanban", "dataTable"]),
7927
+ extensionId: string2().nullable(),
7697
7928
  fields: array(boardFieldSchema)
7698
7929
  });
7699
- var boardFiltersSchema = record(string2(), array(string2()));
7930
+ var boardViewSettingsSchema = union([kanbanViewSettingsSchema, dataTableRendererSettingsSchema]);
7700
7931
  var boardViewSchema = object({
7701
7932
  id: string2(),
7702
7933
  boardId: string2(),
7703
7934
  title: string2(),
7704
- settings: kanbanRendererSettingsSchema,
7705
- filters: boardFiltersSchema,
7935
+ settings: boardViewSettingsSchema,
7936
+ filter: viewFilterGroupSchema,
7937
+ sorts: viewSortsSchema,
7706
7938
  builtIn: boolean2()
7707
7939
  });
7708
7940
  var boardViewsSchema = object({ views: array(boardViewSchema), defaultViewId: string2() });
7709
7941
  var boardViewUpdateSchema = object({
7710
7942
  title: string2().trim().min(1).optional(),
7711
- settings: kanbanRendererSettingsSchema.partial().optional(),
7712
- filters: boardFiltersSchema.optional()
7943
+ settings: union([kanbanViewSettingsSchema.partial().strict(), dataTableRendererSettingsSchema.partial().strict()]).optional(),
7944
+ filter: viewFilterGroupSchema.optional(),
7945
+ sorts: viewSortsSchema.optional()
7713
7946
  }).strict();
7714
7947
  var boardViewCreateSchema = boardViewUpdateSchema.extend({
7715
7948
  title: string2().trim().min(1),
@@ -7718,6 +7951,24 @@ var boardViewCreateSchema = boardViewUpdateSchema.extend({
7718
7951
  // ../pstdio-api-contracts/src/extension-kernel/api-versions.ts
7719
7952
  var numericIdentifier = "(?:0|[1-9]\\d*)";
7720
7953
  var caretTerm = new RegExp(`^\\^(${numericIdentifier}\\.${numericIdentifier}\\.${numericIdentifier})$`);
7954
+ // ../pstdio-api-contracts/src/extension-kernel/boolean-view-filter.ts
7955
+ var normalizeBooleanViewRule = (rule, type) => {
7956
+ const mapping = type.kind === "boolean" ? type.legacyValues : undefined;
7957
+ if (!mapping || !Array.isArray(rule.value) || rule.value.length === 0)
7958
+ return rule;
7959
+ if (rule.condition !== "is-any-of" && rule.condition !== "is-none-of")
7960
+ return rule;
7961
+ if (rule.value.some((value) => !Object.hasOwn(mapping, value)))
7962
+ return rule;
7963
+ const values = new Set(rule.value.map((value) => mapping[value]));
7964
+ if (values.size === 2)
7965
+ return { attributeId: rule.attributeId, condition: rule.condition === "is-any-of" ? "is-not-empty" : "is-empty" };
7966
+ return {
7967
+ attributeId: rule.attributeId,
7968
+ condition: rule.condition === "is-any-of" ? "is" : "is-not",
7969
+ value: [...values][0]
7970
+ };
7971
+ };
7721
7972
  // ../pstdio-api-contracts/src/extension-kernel/builtin-refs.ts
7722
7973
  var hostRef = (kind, id) => ({ extensionId: "pstdio", kind, id });
7723
7974
  var workbenchModes = {
@@ -7809,6 +8060,24 @@ var workbenchSlots = {
7809
8060
  var localContributionIdPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\.[a-z0-9]+(?:-[a-z0-9]+)*)*$/;
7810
8061
  var isValidLocalContributionId = (id) => localContributionIdPattern.test(id);
7811
8062
  var localContributionIdGrammar = 'lowercase kebab-case segments separated by dots, such as "ticket-status.create"';
8063
+ // ../pstdio-api-contracts/src/extension-kernel/data-table-values.ts
8064
+ var resolveDataTableComparableValue = (value, renderer) => {
8065
+ if (typeof value !== "object" || value === null)
8066
+ return value;
8067
+ if ("display" in value)
8068
+ return "sortValue" in value ? value.sortValue : undefined;
8069
+ if (renderer?.type === "diff" && "additions" in value && "deletions" in value && typeof value.additions === "number" && typeof value.deletions === "number")
8070
+ return value.additions + value.deletions;
8071
+ return value;
8072
+ };
8073
+ var resolveDataTableFieldKind = (values, column = {}) => {
8074
+ if (column.type)
8075
+ return column.type;
8076
+ if (column.renderer?.type === "date")
8077
+ return "date";
8078
+ const comparable = values.map((value) => resolveDataTableComparableValue(value, column.renderer)).filter((value) => value !== null && value !== undefined);
8079
+ return comparable.length > 0 && comparable.every((value) => typeof value === "number") ? "number" : "string";
8080
+ };
7812
8081
  // ../pstdio-api-contracts/src/extension-kernel/refs.ts
7813
8082
  var createCommandRef = (input) => ({ ...input, kind: "command" });
7814
8083
  var commandRef = Object.assign(createCommandRef, {
@@ -7850,6 +8119,8 @@ var projectEvents = {
7850
8119
  opened: hostEventRef("project.opened")
7851
8120
  };
7852
8121
  var viewDataEvents = {
8122
+ boardViewsChanged: hostEventRef("view.board-views.changed"),
8123
+ resourceAnchorsChanged: hostEventRef("view.resource-anchors.changed"),
7853
8124
  sessionsChanged: hostEventRef("view.sessions.changed"),
7854
8125
  workspacesChanged: hostEventRef("view.workspaces.changed"),
7855
8126
  repositoriesChanged: hostEventRef("view.repositories.changed")
@@ -7898,6 +8169,8 @@ var isPageTarget = (value, ancestors = new Set) => {
7898
8169
  return false;
7899
8170
  if (value.section !== undefined && !isRecord(value.section))
7900
8171
  return false;
8172
+ if (value.position !== undefined && (!isFileSourcePosition(value.position) || value.section !== undefined))
8173
+ return false;
7901
8174
  if (!isOpenIntent(value.open))
7902
8175
  return false;
7903
8176
  if (value.parent === undefined)
@@ -7971,12 +8244,13 @@ var packageAsset = (path, baseUrl) => ({
7971
8244
  baseUrl
7972
8245
  });
7973
8246
  // ../pstdio-api-contracts/src/extension-kernel/types/extension.ts
7974
- var EXTENSION_API_VERSION = "0.1.1";
8247
+ var EXTENSION_API_VERSION = "0.1.2";
7975
8248
  // ../pstdio-api-contracts/src/extension-kernel/types/webview-capabilities.ts
7976
8249
  var WEBVIEW_HOST_CAPABILITY_VERSION = 1;
7977
8250
  var WEBVIEW_DECLARABLE_CAPABILITIES = [
7978
8251
  "clipboard.write",
7979
8252
  "commands.execute",
8253
+ "commands.stream",
7980
8254
  "navigation.open",
7981
8255
  "placement.close",
7982
8256
  "notification.show",
@@ -8014,6 +8288,66 @@ var fileRecordSchema = object({
8014
8288
  created_at: string2(),
8015
8289
  updated_at: string2()
8016
8290
  });
8291
+ // ../pstdio-api-contracts/src/harness-commands.ts
8292
+ var harnessCommandSchema = object({
8293
+ name: string2(),
8294
+ description: string2(),
8295
+ argumentHelp: string2().optional(),
8296
+ composer: object({
8297
+ label: string2(),
8298
+ modeId: string2().optional(),
8299
+ reservedArguments: array(string2()).optional()
8300
+ }).optional(),
8301
+ disabledReason: string2().optional()
8302
+ });
8303
+ var harnessModeActionSchema = object({
8304
+ id: string2(),
8305
+ label: string2(),
8306
+ icon: string2().optional(),
8307
+ argument: object({ label: string2(), value: string2().optional() }).optional()
8308
+ });
8309
+ var harnessModeSchema = object({
8310
+ id: string2(),
8311
+ label: string2(),
8312
+ description: string2(),
8313
+ state: string2(),
8314
+ indicator: object({ label: string2(), tone: _enum(["neutral", "info", "success", "warning", "error"]) }).optional(),
8315
+ tagText: string2().optional(),
8316
+ closeActionId: string2().optional(),
8317
+ confirmation: object({
8318
+ id: string2(),
8319
+ title: string2(),
8320
+ actionId: string2(),
8321
+ cancelLabel: string2().optional(),
8322
+ model: string2().optional()
8323
+ }).optional(),
8324
+ actions: array(harnessModeActionSchema)
8325
+ });
8326
+ var harnessCommandStateSchema = object({
8327
+ commands: array(harnessCommandSchema),
8328
+ modes: array(harnessModeSchema),
8329
+ slashCommands: boolean2()
8330
+ });
8331
+ var harnessOperationSchema = discriminatedUnion("kind", [
8332
+ object({ kind: literal("command"), text: string2().min(1) }).strict(),
8333
+ object({
8334
+ kind: literal("mode-action"),
8335
+ modeId: string2(),
8336
+ actionId: string2(),
8337
+ argument: string2().optional()
8338
+ }).strict()
8339
+ ]);
8340
+ var draftHarnessCommandInputSchema = object({
8341
+ project_id: string2().min(1),
8342
+ agent: string2().min(1),
8343
+ workspace_id: string2().optional(),
8344
+ model: string2().optional(),
8345
+ params: record(string2(), union([string2(), boolean2()])).optional()
8346
+ }).strict();
8347
+ var harnessOperationResponseSchema = object({
8348
+ status: _enum(["completed", "started"]),
8349
+ message: string2().optional()
8350
+ });
8017
8351
  // ../pstdio-api-contracts/src/history-turn-evidence.ts
8018
8352
  var historyTurnEvidence = (known, native, prompt, body) => {
8019
8353
  const signatures = (turn) => JSON.stringify([prompt(turn), body(turn)]);
@@ -8270,6 +8604,93 @@ var updateProjectInputSchema = object({
8270
8604
  }).refine((value) => Object.keys(value).length > 0, {
8271
8605
  message: "At least one field must be provided"
8272
8606
  });
8607
+ // ../pstdio-api-contracts/src/session-request-values.ts
8608
+ var harnessParamValueSchema = union([string2(), boolean2()]);
8609
+ var harnessParamsInputSchema = record(string2(), harnessParamValueSchema);
8610
+ var sessionAttachmentRefSchema = object({ file_id: string2().min(1) });
8611
+
8612
+ // ../pstdio-api-contracts/src/queued-follow-ups.ts
8613
+ var queuedFollowUpSchema = object({
8614
+ queuePosition: number2().int().positive(),
8615
+ revision: string2().min(1),
8616
+ prompt: string2(),
8617
+ steeringUnavailableReason: string2().nullable().optional(),
8618
+ steeringDelivery: object({ id: string2(), runStartedAt: string2() }).nullable(),
8619
+ model: string2().nullable(),
8620
+ params: harnessParamsInputSchema,
8621
+ attachments: array(sessionAttachmentRefSchema)
8622
+ });
8623
+ var updateQueuedFollowUpInputSchema = object({
8624
+ prompt: string2().trim().min(1),
8625
+ expectedRevision: string2().min(1).optional(),
8626
+ model: string2().min(1).nullable().optional(),
8627
+ params: harnessParamsInputSchema.nullable().optional(),
8628
+ attachments: array(sessionAttachmentRefSchema).optional()
8629
+ });
8630
+ var combineQueuedFollowUpsInputSchema = object({
8631
+ sourcePosition: number2().int().positive(),
8632
+ sourceRevision: string2().min(1),
8633
+ targetRevision: string2().min(1)
8634
+ });
8635
+ var queuedFollowUpUpdateResponseSchema = object({ ok: literal(true), request: queuedFollowUpSchema });
8636
+ var pendingQueuedFollowUpsResponseSchema = object({
8637
+ requests: array(queuedFollowUpSchema),
8638
+ activeRunStartedAt: string2().nullable(),
8639
+ steeringAvailable: boolean2(),
8640
+ steeringUnavailableReason: string2().nullable()
8641
+ });
8642
+ var steerQueuedFollowUpInputSchema = object({
8643
+ expectedRevision: string2().min(1),
8644
+ expectedRunStartedAt: string2().min(1)
8645
+ });
8646
+ var queuedSteeringResultSchema = discriminatedUnion("status", [
8647
+ object({ status: literal("accepted"), deliveryId: string2() }),
8648
+ object({
8649
+ status: literal("rejected"),
8650
+ reason: _enum([
8651
+ "unsupported",
8652
+ "inactive",
8653
+ "stale_run",
8654
+ "blocking_input",
8655
+ "missing",
8656
+ "stale_revision",
8657
+ "different_settings",
8658
+ "delivery_failed",
8659
+ "invalid_attachments"
8660
+ ]),
8661
+ message: string2()
8662
+ }),
8663
+ object({ status: literal("uncertain"), deliveryId: string2(), message: string2() })
8664
+ ]);
8665
+ // ../pstdio-api-contracts/src/resource-anchors.ts
8666
+ var resourceLinkRefSchema = extensionResourceRefSchema.extend({
8667
+ type: string2().min(1),
8668
+ id: string2().min(1),
8669
+ projectId: string2().min(1).optional(),
8670
+ extensionId: string2().min(1).optional()
8671
+ });
8672
+ var resourceAnchorSchema = resourceLinkRefSchema.extend({
8673
+ role: _enum(["primary", "context", "source", "result"]).optional()
8674
+ });
8675
+ var addResourceAnchorsSchema = object({
8676
+ resource: resourceLinkRefSchema,
8677
+ anchors: array(resourceAnchorSchema).max(100)
8678
+ });
8679
+ var removeResourceAnchorsSchema = object({
8680
+ resource: resourceLinkRefSchema,
8681
+ refs: array(resourceLinkRefSchema).max(100)
8682
+ });
8683
+ var resourceAnchorQuerySchema = object({
8684
+ resource: resourceLinkRefSchema,
8685
+ direction: _enum(["outgoing", "incoming", "both"]).optional(),
8686
+ role: _enum(["primary", "context", "source", "result"]).optional(),
8687
+ cursor: string2().optional(),
8688
+ limit: number2().int().min(1).max(100).optional()
8689
+ });
8690
+ var resourceAnchorPageSchema = object({
8691
+ items: array(object({ source: resourceLinkRefSchema, target: resourceAnchorSchema })),
8692
+ nextCursor: string2().optional()
8693
+ });
8273
8694
  // ../pstdio-api-contracts/src/session-attachment-types.ts
8274
8695
  var sessionAttachmentMimeTypesByExtension = {
8275
8696
  c: "text/plain",
@@ -8421,8 +8842,6 @@ var sessionStatusSchema = _enum([
8421
8842
  "cancelled",
8422
8843
  "disconnected"
8423
8844
  ]);
8424
- var harnessParamValueSchema = union([string2(), boolean2()]);
8425
- var harnessParamsInputSchema = record(string2(), harnessParamValueSchema);
8426
8845
  var sessionSchema = object({
8427
8846
  id: string2(),
8428
8847
  project_id: string2().nullable(),
@@ -8442,8 +8861,8 @@ var sessionSchema = object({
8442
8861
  created_at: string2(),
8443
8862
  updated_at: string2()
8444
8863
  });
8445
- var sessionAttachmentRefSchema = object({
8446
- file_id: string2().min(1)
8864
+ var createSessionResponseSchema = sessionSchema.extend({
8865
+ operation_result: harnessOperationResponseSchema.optional()
8447
8866
  });
8448
8867
  var sessionAttachmentSchema = object({
8449
8868
  file_id: string2(),
@@ -8459,6 +8878,7 @@ var createSessionInputSchema = object({
8459
8878
  project_id: string2().min(1),
8460
8879
  title: string2().min(1),
8461
8880
  prompt: string2().min(1).optional(),
8881
+ operation: harnessOperationSchema.optional(),
8462
8882
  agent: string2().min(1).optional(),
8463
8883
  workspace_id: string2().optional(),
8464
8884
  anchors: array(extensionResourceRefSchema).optional(),
@@ -8493,7 +8913,10 @@ var followUpDecisionSchema = union([
8493
8913
  var followUpResponseSchema = sessionSchema.extend({
8494
8914
  follow_up: followUpDecisionSchema
8495
8915
  });
8496
- var sessionQueuedMessagesResponseSchema = object({ messages: array(sessionMessageSchema) });
8916
+ var sessionQueuedMessagesResponseSchema = object({
8917
+ messages: array(sessionMessageSchema),
8918
+ queue: pendingQueuedFollowUpsResponseSchema.optional()
8919
+ });
8497
8920
  var sessionConversationSourcesSchema = object({
8498
8921
  checkpoint: array(sessionMessageSchema).nullable(),
8499
8922
  native: array(sessionMessageSchema).nullable(),
@@ -8531,8 +8954,7 @@ var skillSourceKindSchema = _enum(["project", "extension"]);
8531
8954
  var skillAgentInstallationSchema = object({
8532
8955
  agent_id: string2(),
8533
8956
  agent_name: string2(),
8534
- installed_version: string2().nullable(),
8535
- outdated: boolean2()
8957
+ installed_version: string2().nullable()
8536
8958
  });
8537
8959
  var skillSchema = object({
8538
8960
  id: string2(),
@@ -8556,7 +8978,6 @@ var skillSchema = object({
8556
8978
  });
8557
8979
  var skillWithContentSchema = skillSchema.extend({
8558
8980
  installed_agents: array(string2()),
8559
- outdated_agents: array(string2()),
8560
8981
  agent_installations: array(skillAgentInstallationSchema)
8561
8982
  });
8562
8983
  var updateSkillInputSchema = object({